Android应用程序的其中一个伟大之处是它们相互通信与集成的能力。当某个功能并不是您的应用程序的核心,且它已经在其他应用程序中存在时,为什么要重新发明它呢?
本课程涵盖了使用Intent API和ActionProvider对象在应用程序之间发送和接收内容的一些常见的方式。
将内容发送到其他应用程序
了解如何设置你的应用程序能够使用意图发送文本和二进制数据到其他应用程序。
接收来自其他应用程序的内容
了解如何设置您的应用程序能够接收文本和二进制数据从意图。
添加一个简单的分享操作
了解如何添加一个“分享”的操作项到你的操作栏。
当你构建一个意图时,你必须指定你想意图“触发”的操作。Android定义了一些操作,其中包括ACTION_SEND,你大概可以猜到,它表明意图是把数据从一个活动发送到另一个,甚至跨进程边界。将数据发送到另一个活动,所有你需要做的就是,指定数据及其类型,系统将识别出兼容的接收活动,并把它们显示给用户(如果有多个选项),或立即启动活动(如果只有一个选项)。同样,你可以在你的mainfest文件中指定你的活动从其他应用程序能接收的数据类型。
通过意图在应用程序之间发送和接收数据的最常用于社交分享内容。意图允许用户使用他们最喜爱的应用程序快速简单地分享信息,。
注:添加一个分享操作项目到ActionBar的最好办法是使用ShareActionProvider,成为可在API级别14。ShareActionProvider在添加一个简单的分享操作的课程中讨论。
图1。手机中ACTION_SEND意图选择器的截图。
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);
如果有一个安装的应用程序用过滤器(filter)匹配ACTION_SEND和MIME类型text / plain,Android系统将运行它;如果有一个以上的应用程序匹配,系统会显示一个消歧(disambiguation)对话框(一个选择器),允许用户选择其中一个应用程序。如果你调用意图的Intent.createChooser(),Android将始终显示选择器。这样做有以下优势:
· 即使用户为意图选择了默认操作,选择器将仍然可以显示。
· 如果没有应用程序匹配,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所示。
可选地,您可以对意图设置一些标准的附加信息(extras):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指向的数据。有很多方法来处理这个:
o 把数据写入到所有的应用程序可以读取的外部/共享存储(如SD卡)的一个文件上。使用Uri.fromFile()来创建可以传递到共享意图的Uri。但是,请记住,并不是所有的应用程序处理file://
样式的Uri。
o 在MODE_WORLD_READABLE模式下使用openFileOutput()把数据写入到你自己的应用程序目录下的一个文件中,然后用getFileStreamPath()返回一个File。使用之前的选项,Uri.fromFile()将为你的共享意图创建一个file://
样式的Uri。
o 可以使用scanFile()扫描图像、视频和音频等媒体文件并添加到系统MediaStore。onScanCompleted()回调方法返回content://
样式的Uri适用于包含在你的共享意图中。
o 使用insertImage()可以把图像插入到系统MediaStore中,它将返回content://
样式的Uri适用于包含在你的共享意图中。
o 存储数据到你自己的ContentProvider中,确保其他应用程序有正确的权限访问您的provider(或使用per-URI权限)。
要分享多条内容,对指向内容的URI列表使用ACTION_SEND_MULTIPLE 操作。MIME类型根据你要分享的混合内容而定。例如,如果你要分享3个JPEG图像,类型仍是“image/jpeg”
。对于混合的图像类型,它应该是用“image/*”
来
匹配一个处理任何类型图像的活动。您应该只使用“*/*”
,
如果你分享了各种各样的类型。如前所述,轮到要接收的应用程序来解析和处理您的数据。下面是一个例子:
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,"Shareimages to.."));
像之前一样,确保所提供的URI指向接收应用程序能够访问的数据。