先来说说分享,毕竟没有分享何来接收分享可谈?
分享目前已实现的有两种方式:后台代码实现、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、蓝牙等),并展示出来让我们选择。
分享完毕就要接收,再来说说如何接收
以接收图片为例,新建一个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。