内容共享 之 发送内容到其他的APP

来源:互联网 发布:淘宝换手机屏幕可靠么 编辑:程序博客网 时间:2024/03/29 14:37

源地址:http://developer.android.com/training/sharing/send.html

当构造一个intent的时候,必须要指明要触发的动作。android定义了一系列动作,其中有一个就是ACTION_SEND,如文字的意思,表示intent从一个activity发送内容到另外一个activity,甚至可在不同进程间通信。要发送数据给另外一个activity,你仅仅要做的就是指明数据和它的类型,系统会自动是识别这个信息,然后调用startActivity的时候就会显示出可以接收这个信息的activity,可能有多个,如果只有一个,那么会直接启动这个个activity.同样的,你可以在你的manifest文件里面声明你的activity想要接收的数据类型,就是上一节说的内容。

利用intent来在两个APP之间共享内容,最常用的地方就是社交化网络的内容分析。intent可以让用户方便快速的分享内容到自己喜欢的APP。

注意:给一个ActionBar添加一个分享的功能,最好的方法是调用调用ShareActionProvider,这个函数是在api 14 之上可用的。关于这个函数的更多信息请阅读:Adding an Easy Share Action.

发送文本内容

ACTION_SEND最直接和常用的使用是用来发送一段文本内容到另外一个activity。例如,android自带的浏览器可用把当前打开的URL页面作为文本内容分享给其他的APP。通常是通过邮件或者社交网络来分享一篇文章或整个网页内容。下面的代码就可以实现这种分享需求:

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);

如果系统有一个APP里面有匹配ACTION_SEND和text/plain类型的MMI的过滤器(filter),那么系统就会在上面的代码运行的时候启动这个APP,如果有多个,那么就会都显示出来,让用户选择一个。也可以使用Intent.createChooser()来创建一个选择器,那么每次都会显示匹配的APP。

  • 即使用户在之前有选择默认的程序,但是如果用上面的createChooser来创建了一个选择器,那么,还是会每次都会显示出来所有的匹配的APP
  • 如果没有APP符合动作和数据类型,那么系统会显示一条信息。
  • 可以为选择器指定标题

下面是修改的代码,创建一个选择器:

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)));

结果如图所示:

可以根据需求,设置其他标准的extra数据到intent:EXTRA_EMAIL,EXTRA_CC,EXTRA_BCC,EXTRA_SUBJECT.然而,如果接收到intent的APP如果没有设置为支持前面这些标准的exta数据,那么这些数据会被自动忽略,不会产生任何效果。也可以自定义extra的数据,但是除非接收的APP可以理解这个数据,不然不会产生任何作用。所以一般的,你自定义的extra数据,都是同时也被要接收这个intent的APP定义的。

注意:有一些邮箱应用,如Gmail,就需要一个String[]作为extra数据,比方说EXTRA_EMAILEXTRA_CC,用putExtra(String, String[])把这个需要的数据放到intent里面去。

发送二进制内容

二进制数据的发送要用到一个由ACTION_SEND动作和MIME 类型组成的intent,以及一个存放Uri的EXTRA_STREAM的extra数据。这个经常用来分享一个图片内容,但其实这种方式可以被用来分享所有的二进制内容。

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 类型,但这个仅仅会匹配常用的类型
  • 接收intent的APP需要有访问Uri指定的资源的权限。有几种处理这种情况的方式:

     把数据放到外部存储器或者共享存储器,比方说SD卡,这样所有的APP都可以读取这个数据。利用Uri.fromFile()创建一个Uri,传递给要执行分享动作intent。这里要记住,不是所有的APP处理的是file://风格Uri。

     利用openFileOutput(),设置模式为MODE_WORLD_READABLE,创建一个文件,把数据写入到这个文件里面,然后利用getFileStreamPath()可以返回关于这个数据的一个File对象,像上面一样,可以利用Uri.fromFile()创建一个file://风格的Uri,传递给intent.

     多媒体文件,如视频,音频,图像,都可以用scanFile()来扫描和添加到系统的MediaStore里面。onScanCompleted()回调函数会返回一个content://风格Uri,然后可以在你的要执行分享动作的intent 里面使用。

     图像文件也可用insertImage()方法插入到系统的MediaStore里面,会返回一个content://风格Uri,放到intent里面。

     在你自己的ContentProvider里面存放数据,保证其他的APP有权限可以访问你的这个provider。

发送多个内容

想要同时发送分享多个内容,可以使用ACTION_SEND_MULTIPLE创建一个intent,同时设置一个Uri列表指向要分享的多个内容。MIME类型,根据你要分享的内容类型进行组合。比方说,如果想要分享3张JPEG图片,那么就使用"image/jpeg"。但是如果如果分享的图片类型是多种的,那么就可以使用"image/*"来匹配那个可以处理任何图片类型的activity。当你分享多种类型的内容时候,就可以用"*/*"来指定。如前面所说,由接收这个intent的APP来解析和处理你分享的数据。例如:

ArrayList<Uri> imageUris = new ArrayList<Uri>();imageUris.add(imageUri1); // Add your image URIs hereimageUris.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.."));

在所有分享动作之前,请确保被发送到的APP有访问和处理有你发送的Uri指定的数据的权限。

 

 

 

 

 

 

 

 

原创粉丝点击