Android 应用程序之间内容分享详解(二)

本文主要介绍Android应用程序从其他应用接收内容的方法。以新建名为SharedContext的Android工程为例,通过修改Manifest文件定义Activity能接收的Intent,创建Intent过滤器。还展示了选择系统图库分享图片、分享文本文件等操作的界面情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

转载请注明出处:http://blog.youkuaiyun.com/xiaanming/article/details/9428613

Android 应用程序之间内容分享详解(一)


之前给大家分享了你开发的应用程序给其他应用程序分享内容,想了解的朋友点击:Android 应用程序之间内容分享详解(一)今天分享的是从其他的应用程序接收内容,比如你开发了一个社交网络的应用,你其中的某个Activity可以接受人们从其他的应用分享的东西,例如分享文字或者从图库分享图片等等,接下来我们利用一个例子来讲解从其他的应用接受内容

1.我们新建一个Android工程,名字为SharedContext,修改Manifest文件

我们需要在Manifest文件中定义这个Activity能接收什么样的Intent,我们需要创建Intent过滤器,使用 <intent-filter> 元素来过滤我们能接收的Intent,下面我们举个简单的例子,相信大家知道举一反三,下面的例子我们的应用程序可以处理文本,文本文件,单一的图片和多张图片,我们定义Manifest文件如下

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.sharedcontext"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="16" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.example.sharedcontext.MainActivity"            android:label="@string/app_name" >                        <!-- 应用程序的启动 Intent,我们例子只有一个Activity-->            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <!-- 处理文字的Intent 我们需要定义action,  category, 和文字对应的MIME -->            <intent-filter>                <action android:name="android.intent.action.SEND" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="text/*" />            </intent-filter>            <!-- 处理单张图片的Intent -->            <intent-filter>                <action android:name="android.intent.action.SEND" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="image/*" />            </intent-filter>            <!-- 处理多张图片的Intent -->            <intent-filter>                <action android:name="android.intent.action.SEND_MULTIPLE" />                <category android:name="android.intent.category.DEFAULT" />                <data android:mimeType="image/*" />            </intent-filter>        </activity>    </application</manifest>
当一个应用程序构建上面那样子的Intent,并吧它传递给StartActivity(),我们的应用程序就会被列在Intent选择器中,当用户选择该应用程序就进入相对应的Activity(上面的例子是MainActivity),我们只需要在MainActivity处理这样内容并用相对应的UI显示, MainActivity如下

package com.example.sharedcontext;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends Activity @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  Intent intent = getIntent();  //获得Intent的Action  String action = intent.getAction();  //获得Intent的MIME type  String type = intent.getType();      if(Intent.ACTION_SEND.equals(action) && type != null){   //我们这里处理所有的文本类型   if(type.startsWith("text/")){    //处理获取到的文本,这里我们用TextView显示    handleSendText(intent);   }   //图片的MIME type有 image/png , image/jepg, image/gif 等,   else if(type.startsWith("image/")){    //处理获取到图片,我们用ImageView显示    handleSendImage(intent);   }  }  else if(Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null){    if (type.startsWith("image/")) {      //处理多张图片,我们用一个GridView来显示              handleSendMultipleImages(intent);           }  } } /**  * 用TextView显示文本  * 可以打开一般的文本文件  * @param intent  */ private void handleSendText(Intent intent){   TextView textView = new TextView(this);      //一般的文本处理,我们直接显示字符串   String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);   if(sharedText != null){    textView.setText(sharedText);   }         //文本文件处理,从Uri中获取输入流,然后将输入流转换成字符串   Uri textUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);   if(textUri != null){    try {     InputStream inputStream = this.getContentResolver().openInputStream(textUri);     textView.setText(inputStream2Byte(inputStream));   } catch (Exception e) {    e.printStackTrace();   }   }     //设置给Activity   setContentView(textView); }   /**  * 将输入流转换成字符串  * @param inputStream  * @return  * @throws IOException  */ private String inputStream2Byte(InputStream inputStream) throws IOException{  ByteArrayOutputStream bos = new ByteArrayOutputStream();    byte [] buffer = new byte[1024];  int len = -1;    while((len = inputStream.read(buffer)) != -1){   bos.write(buffer, 0, len);  }    bos.close();    //指定编码格式为UIT-8  return new String(bos.toByteArray(), "UTF-8"); }   /**  * 用ImageView显示单张图片  * @param intent  */ private void handleSendImage(Intent intent) {     Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);     if (imageUri != null) {      ImageView imageView = new ImageView(this);      imageView.setImageURI(imageUri);      setContentView(imageView);     } }   /**  * 用GridView显示多张图片  * @param intent  */ private void handleSendMultipleImages(Intent intent) {     final ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);     if (imageUris != null) {      GridView gridView = new GridView(this);      //设置item的宽度      gridView.setColumnWidth(130);      //设置列为自动适应      gridView.setNumColumns(GridView.AUTO_FIT);      gridView.setAdapter(new GridAdapter(this, imageUris));      setContentView(gridView);            gridView.setOnItemClickListener(new OnItemClickListener() {    @Override    public void onItemClick(AdapterView<?> parent, View view,      final int position, long id) {          //点击GridView的item 可以分享图片给其他应用     //这里可以参考http://blog.youkuaiyun.com/xiaanming/article/details/9395991     Intent intent = new Intent();     intent.setAction(Intent.ACTION_SEND);     intent.putExtra(Intent.EXTRA_STREAM, imageUris.get(position));     intent.setType("image/*");     startActivity(Intent.createChooser(intent, "共享图片"));    }   });           } }  /**  * 重写BaseAdapter  * @author xiaanming  *  */ public class GridAdapter extends BaseAdapter{  private Context mContext;  private ArrayList<Uri> list;    public GridAdapter(Context mContext, ArrayList<Uri> list){   this.list = list;   this.mContext = mContext;  }  @Override  public int getCount() {   return list.size();  }  @Override  public Object getItem(int position) {   return list.get(position);  }  @Override  public long getItemId(int position) {   return position;  }  @Override  public View getView(int position, View convertView, ViewGroup parent) {   ImageView imageView;   if(convertView == null){    imageView = new ImageView(mContext);    imageView.setPadding(8, 8, 8, 8);   }else{    imageView = (ImageView) convertView;   }   imageView.setImageURI(list.get(position));   return imageView;  } }}

运行程序之后,然后我们选择系统图库,选择多张图片(如图一)进行分享,我们自己的应用程序分享多张界面(如图二)点击我们应用程序的item,选择分享单张图片(如图三)我们继续选择我们自己的应用程序来显示(如图四),新建一个备忘录保存,长按备忘录进行分享(如图五),分享文本文件的显示界面(如图六)





内容大概就是这样,睡觉去了如果你觉得这篇文章对你有点帮助,你就帮我顶顶,谢谢大家关注!


           
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值