共享内容

来源:互联网 发布:java金融项目技术难点 编辑:程序博客网 时间:2024/04/29 06:33
向其他App发送数据

当你构建一个intent时,你必须要指定该intent要触发的action。Android定义了很多action,包
括ACTION_SEND,你可以猜想一下,指明了该intent是用来把数据从一个activity发送到另一
个activity,甚至能够跨越进程的界限。要给另一个activity发送数据,你所要做的就是指定数
据和其类型,系统将识别兼容的接受activity,并把它们展示给用户,或者立即启动activity。
同样的,你也可以在manifest中定义你的activity支持的数据类型,以便从其他应用接受数据。

使用intents在application之间发送和接收数据对于数据的共享是非常普遍的。Intents使得用户
能够快速和轻松的共享数据,使用他们最喜欢的应用程序。

发送文本内容

对于ACTION_SEND最直接和普遍的使用就是从一个activity发送文本内容到另一个activity。例
如,内置的浏览器应用能够与任何应用以文本形式共享当前显示页面的URL。这对于通过email
或社交网络共享一篇文章或网站是非常有用的。
?
代码片段,双击复制
01
02
03
04
05
Intent sendIntent = newIntent();
 endIntent.setAction(Intent.ACTION_SEND);
 sendIntent.putExtra(Intent.EXTRA_TEXT,"This is my text to send.");
 sendIntent.setType("text/plain");
startActivity(sendIntent);

如果有一个已安装的应用程序,匹配了ACTION_SEND和MIME类型为text/plain,Android系统
将会运行它。如果有多于一个的应用程序被匹配,系统将会展示一个对话窗口让用户选择一
个app。如果你调用了Intent.createChooser()方法,Android系统总是会显示窗口,这样做有一
些优势:
就算用户之前为这个intent选择了一个默认选项,选择器也会显示。
如果没有应用程序被匹配,Android将会显示一个系统消息。
你可以为选择窗口制定一个标题。
?
代码片段,双击复制
01
02
03
04
05
Intent sendIntent = newIntent();
 endIntent.setAction(Intent.ACTION_SEND);
 sendIntent.putExtra(Intent.EXTRA_TEXT,"This is my text to send.");
 sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

或者,你可以为intent设置一些标准的附加数据:EXTRA_EMAIL,EXTRA_CC,EXTRA_BCC,
EXTRA_SUBJECT。然而,如果接受的应用程序没有被设计使用它们,什么也不会发生。你也
可以使用自定义的extras,除非接受的application能够理解其意思,不然没有效果。通常情况
下,你可以使用由接收应用程序自定义的extras。

发送二进制数据

二进制的数据可以通过使用ACTION_SENDaction,并与设置适当的MIME类型相结合,并把数
据的URI设置在一个叫EXTRA_STREAM的extra中。这通常被用来共享图片,但能够被用来共享
任何类型的二进制内容:
?
代码片段,双击复制
01
02
03
04
Intent shareIntent = newIntent();
 hareIntent.setAction(Intent.ACTION_SEND);
 hareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg");
 tartActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

注意下面的事项:
1.你可以使用“*/*”的MIME类型,但这仅仅会匹配能够处理一般数据流的activity。
2.接收的应用程序需要权限来访问URI指向的数据。有一些方法来处理这个问题:
(1)将数据写到外部存储上,所有的app都可以读取。使用Uri.fromFile()来创建能够被传
递到intent的Uri。然而,请记住,并不是所有的应用程序都能处理file://样式的Uri。
(2)使用openFileOutput()方法的MODE_WORLD_READABLE模式在你应用程序的目录下
写数据,之后getFileStreamPath()能够被用来返回一个File。
(3)媒体文件,例如图像,视频和音频,通过使用scanFile()能够被扫描并添加到系统的
MediaStore。onScanCompleted()回调函数返回一个content://样式的uri。
(4)将数据存储在你自己的ContentProvider,确保其他的app具有正确的权限来访问你的
provider。

发送多条数据

要共享多条数据,使用ACTION_SEND_MULTIPLEaction,并与指向资源的URI列表结合起来。
MIME类型根据你共享的内容有所不同。例如,如果你要共享3个JPEG图片,类型应该是“
image/jpeg”。对于混合的图片类型,应该是“image/*”。如果你要共享各种各样的类型,你
应该使用“*/*”。
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
ArrayList<Uri> imageUris = newArrayList<Uri>();
 imageUris.add(imageUri1);
 // Add your image URIs here
 imageUris.add(imageUri2);
 Intent shareIntent = newIntent();
 hareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
 shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
 hareIntent.setType("image/*");
 startActivity(Intent.createChooser(shareIntent,"Share images to.."));