当你构建一个意图,您必须指定您想要的行动意图“触发。“Android定义了几个动作,包括ACTION_SEND,您大概可以猜到,表明意图是将数据从一个活动到另一个,甚至跨进程边界。发送数据到另一个活动,所有您需要做的是指定数据及其类型,系统将识别兼容接收活动,并将它们显示给用户(如果有多个选项)或立即启动活动(如果只有一个选项)。类似地,您可以宣传你的活动支持的数据类型接收从其他应用程序通过指定他们在你的清单。
发送和接收应用程序之间的数据和意图是最常用的社交分享的内容。意图允许用户快速而方便地共享信息,用他们最喜欢的应用程序。
注意:最好的方法添加一个分享ActionBar是使用ShareActionProvider行动项目,这在API级别14。ShareActionProvider课中讨论是关于添加一个简单的共享行动。
发送文本内容
最简单和常用的ACTION_SEND行动是发送文本内容从一个活动到另一个地方。例如,内置的浏览器应用程序可以共享当前显示页面的URL作为文本与任何应用程序。这是用于分享的一篇文章或网站与朋友通过电子邮件或社交网络。这是代码来实现这种类型的共享:
Intent sendIntent = new Intent(); sendIntent.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系统将运行它;如果多个应用程序匹配,系统显示一个消歧对话框(一个“选择器”),允许用户选择一个应用程序。
然而,如果你叫Intent.createChooser(),通过它您的意图对象,它返回一个版本的意图,总是显示选择器。这有一些优点:
即使用户之前选择一个默认的行动意图,选择器仍将显示。
如果没有应用程序匹配,Android将显示一个系统消息。
您可以指定一个标题的选择器对话框。
这是更新后的代码:
Intent sendIntent = new Intent(); sendIntent.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)));
结果对话框如图1所示。
可选地,您可以设置一些标准的意图支招:EXTRA_EMAIL,EXTRA_CC,EXTRA_BCC EXTRA_SUBJECT。如果接收应用程序不是被设计来使用它们,它只是忽略它们。
注意:一些电子邮件应用程序,例如Gmail,期望一个String[]等额外EXTRA_EMAIL EXTRA_CC,使用putExtra(String,String[])来添加这些到你的意图。
发送二进制内容
二进制数据共享使用ACTION_SEND行动结合设置适当的MIME类型和将URI命名EXTRA_STREAM额外的数据。这是通常用于分享图像,还可以用来分享任何类型的二进制内容:
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
请注意以下几点:
您可以使用“* / *”的MIME类型,但这只会匹配活动能够处理一般的数据流。
接收应用程序需要的权限访问数据Uri指向。推荐的方法是:
将数据存储在自己的内容提供者,确保其他应用程序已经正确的权限访问你的提供者。提供的首选机制是使用per-URI权限的限制是暂时的,只有授权访问接收应用程序。这样一个简单的方法来创建一个内容提供者是使用FileProvider助手类。
使用系统MediaStore。MediaStore主要是针对视频、音频和图像MIME类型,然而从Android 3.0(API级别11)它也可以存储非媒体类型(见MediaStore。文件的更多信息)。文件可以使用scanFile插入MediaStore()之后,一个内容:/ /风格Uri适合分享传递给提供onScanCompleted()回调。注意,一旦添加到系统MediaStore设备上的任何应用程序都可以访问内容。
发送多个部分的内容
分享多个部分的内容,使用ACTION_SEND_MULTIPLE行动一起uri指向内容的列表。MIME类型取决于你分享的内容。例如,如果您分享3 JPEG图像,仍然是“图像/ JPEG”类型。对于图像的混合类型,应该“图像/ *”比赛活动,处理任何类型的图像。你应该只使用“* / *”如果你分享各种各样的类型。如前所述,由接收应用程序来解析和处理您的数据。这里有一个例子:
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, "Share images to.."));和之前一样,确保所提供的uri指向接收应用程序可以访问的数据。