(三)高级篇____5、内容分享——向其他的App发送内容

原文链接:http://docs.eoeandroid.com/training/sharing/send.html

作者:CuGBabyBeaR

完成时间:2012.8.28

 

目录

 [隐藏

向其他应用发送内容

当您创建一个intent的时候,您必须指定您想让intent触发的行为。Android定义了若干行为,包括ACTION_SEND。您可能猜到了,ACTION_SEND表明intent从一个应用中携带了数据发送给另外一个应用,甚至可以跨线程传输。为了向其他应用发送数据,您所要做的只需要定义数据和它的类型,系统会自动分辨能够接受这些数据的应用,然后显示给用户(如果有多个选项的话)或者立即执行这个应用(如果只有一个选项)。相对的,您可以在manifest里声明您的应用能够支持的,从其他应用接收的数据类型。

用intents在应用之间发送和接收数据最常被用于分享内容。intents允许用户用他们喜爱的应用,来快速方便的分享信息。

注:ActionBar添加一个分享按钮最好的方法是使用ShareActionProviderShareActionProvider从API level 14开始可用。在有关Adding an Easy Share Action一节有ShareActionProvider的讨论。

发送文本内容

ACTION_SEND行为最直接和和常见的用法是从一个应用向另一个内容发送文本内容。例如内置浏览器程序可以以文本的形式,向任何应用分享当前显示的页面的URL。这在通过email或者社交网络向朋友分享一个文章或者网站时是很有用的。如下是实现这种分享方式的代码: 

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和text/plain的MIME类型,Android系统会运行这个应用;如果多个应用符合,系统会显示一个消歧对话框(一个选择器)让用户选择应用。如果您为此intent调用java.lang.CharSequence) Intent.createChooser() ,Android会始终显示这个选择器。这么做的好处是:

  • 即使用户已经为这个intent预先选择了一个默认的行为,仍然会显示选择器。
  • 如果没有相符的应用,Android会显示一个系统信息。
  • 您可以为这个选择对话框指定一个标题。

share-text-screenshot.png

Figure 1. Screenshot of ACTION_SEND intent chooser on a handset

如下是使用createChooser()的代码: 

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所示

作为可选项,您可以为您intent的设置一些标准扩展:EXTRA_EMAILEXTRA_CCEXTRA_BCCEXTRA_SUBJECT。但是,如果接受的应用不是为之设计的,此次行为将被忽略。您同样可以使用自定义扩展,但是除非接收应用能够理解,这些扩展将没有效果。通常情况下,您应该使用接收应用自己定义的自定义扩展。

注:一些e-mail应用-例如Gmail-在接到一些例如EXTRA_EMAILEXTRA_CC的扩展时需要一个String[] ,使用java.lang.String[) putExtra(String, String[])]来将这些添加到您的intent中。

发送二进制内容

二进制数据是通过使用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所指向内容的权限。这里有一些方法来处理它:
    • 将数据写在扩展存储或者共享存储(例如SD卡)的文件中.使用Use Uri.fromFile()来建立传递给intent的Uri。但请记住不是所有的应用都能处理file://类型的Uri
    • 在MODE_WORLD_READABLE模式下,使用int) openFileOutput()将数据写在您自己的应用目录下的文件中,之后getFileStreamPath()可以用来返回一个文件。和前面一条相同,Uri.fromFile()会为您的intent建立一个file://类型的Uri。
    • 媒体文件和图像相同,可以通过使用scanFile()扫描视频和音频并添加进系统的MediaStore。onScanCompleted()的回调返回一个content://类型的Uri来匹配您的intent。
    • insertImage()可以将图像插入到系统MediaStore中,并返回一个content://类型的Uri来匹配您的intent。
    • 将数据保存到您自己的ContentProvider中,以保证其他应用有正确访问您provider的权限(或者使用per-URI权限)。

发送复合内容

使用ACTION_SEND_MULTIPLE行为整合指向内容的URI列表,可以发送复合内容。MIME类型会根据您分享内容的组合而改变。例如,如果您分享3个JPEG图像,MIME类型仍然是"image/jpeg"。对于混合的图像类型,MIME将会设置为"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, "Share images to.."));

和之前一样,请确保提供的URI指向接收方应用能够访问的数据。

posted @ 2014-07-31 10:31  ╰→劉じ尛鶴  阅读(133)  评论(0)    收藏  举报