先来说说分享,毕竟没有分享何来接收分享可谈?
分享目前已实现的有两种方式:后台代码实现、ShareActionProvider实现,接着先说通过代码实现
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("/storage/emulated/0/Pictures/145.jpg"));
startActivity(Intent.createChooser(intent,"share this image to..."));
这里分享的是图片,图片以二进制的形式进行传递,所以用Intent.EXTRA_STREAM来标志附加的消息类型。
如果是文字的话原理是一样的,只需将Type和附加信息改成如下即可
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"hello world");
这们就简单实现了内容分享,点击要分享的内容系统就会自动帮我们寻找实现了接收内容的程序(微信、QQ、蓝牙等),并展示出来让我们选择,如下图
那用ShareActionProvider如何实现的呢,首先在菜单文件里添加一个item
<item android:id="@+id/share"
android:orderInCategory="200"
android:title="share"
android:icon="@android:drawable/ic_menu_share"
app:showAsAction="always"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
这里使用的是v7包下的ShareActionProvider,对应的后台代码里面也要用v7包下的类,需要注意的是app:actionProviderClass的前缀是app而不是android,如果写成android会报错并闪退。如果一切正常那么程序启动后应付在标题栏显示一个分享的图片,额,确切的说是图标,点击的后也会展示出能内容的程序,如下图
添加完毕在后台的代码里面也要设置要分享的内容的,不然程序怎么知道要分享什么呢
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem item=menu.findItem(R.id.share);
ShareActionProvider sap= (ShareActionProvider) MenuItemCompat.getActionProvider(item);
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"hi jiujie zhu,do u have lunch?");
if(sap!=null){
sap.setShareIntent(intent);
}
return true;
}
这里分享的是文本信息。
分享完毕就要接收,再来说说如何接收
接收其实挺简单的,至少比我想的简单(我是新手我自豪,咩嘿嘿~~~)
以接收图片为例,新建一个Activity,在清单文件里面设置action、data、category即可,怎么跟接收器有点像呢,看代码
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
</intent-filter>
data表示接收的文件类型,如果是文本类型的是不会接收的。这样进行标注后再分享内容时系统就会识别咱们的程序并展示给用户选择了,请看第二张图里面的ReceiveSharedContentAcitvity,这个就是自定义的接收内容的Activity,就这么简单啊。
光能接收并没用,关键是如何获取分享的内容和如何处理接收到的内容
private void handleImage(){
Intent intent=getIntent();
String action=intent.getAction();
String type=intent.getType();
if(action.equals(Intent.ACTION_SEND)&&type.equals("image/*")){
Uri uri=intent.getParcelableExtra(Intent.EXTRA_STREAM);
//接收多张图片
//ArrayList<Uri> uris=intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if(uri!=null ){
try {
FileInputStream fileInputStream=new FileInputStream(uri.getPath());
Bitmap bitmap= BitmapFactory.decodeStream(fileInputStream);
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
通过getIntent方法获取到包含分享内容的Intent,然后就可以获取里面的内容了。这是说明一点的是如果你分享的图片是在sd卡的话,请给程序添加读取sd卡的权限,不然会显示permission denied
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上面说的都是分享一条文本或图片,如果要多个呢,一样的!只需在分享时用ArratList进行封装就行了,对于接收者来说,需要把action改成
<action android:name="android.intent.action.SEND_MULTIPLEND"/>
表示接收多个内容,在代码里面从Intent中获取内容时用getParcelableArrayListExtra而不是getParcelableExtra。
转载自李洛博客