现在的位置: 首页 > 移动开发> 正文
Android 信息共享专题之内容发布
2012年01月06日 移动开发 评论数 1 ⁄ 被围观 6,469+

构造和触发一个Intent,需要先要指定其Action。Android系统已经预定义了很多Action,其中的ACTION_SEND用来做数据分享,可以把数据从一个Activity发送到另一个Activity, 甚至跨越进程边界的限制。要想给其他的Activity发送内容,您需要做的是构造一个Intent,设置Action类别为ACTION_SEND,把数据填充到该Intent中,并且设置正确的数据的类型,最后触发该Intent,这样系统就会选择最合适的目标Activity来接收和处理该数据。如果候选的目标Activity多于一个,则系统通常会弹出一个对话框让用户来选择,如果候选的目标Activity只有一个,那么系统就会直接启动该Activity来处理数据。同样地,您自己的应用程序也可以在manifest文件中声明可以处理的数据类型,这样当其他Activity发送此种类型的数据时,系统就会将您的App列入到候选名单中。

数据的共享常应用在社会化分享的APP中,方便用户快速和简单的分享自己的共享信息。

注意 :最简单的在ActionBar中添加一个"share action item"的方法是使用ShareActionProvider,其要求API level 14,将在后面的章节讨论。


发送文本数据

数据分享最常用的是Activity之间发送文本内容,例如,系统的内置浏览器可以共享当前正在浏览页面的URL地址,以纯文本的数据格式存储,这非常有助于用户通过Email或者社会化分享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的intent filter设置了ACTION_SEND,并且声明的数据类型匹配纯文本(text/plain)格式,那么系统就会启动它,若此时匹配的APP个数多于一个,系统会弹出一个选择对话框(a "chooser") ,让用户从中选择处理该数据的APP。若您触发该Intent的时候使用了Intent.createChooser() ,那么系统总是会弹出选择对话框(a "chooser") 让用户选择,这么做有如下优点。

  • 即使用户以前选择过默认的处理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));

ACTION_SEND Intent 选择器对话框如下面图示

可选地,您也可以在Intent中设置一些标准的附加参数,比如EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT,除非目标APP会使用该数据,不然也没有什么副作用。通常如果您设计的应用程序可以用来接收和处理该数据,那么应该使用它们。

注意:某些Email邮件处理程序,比如Gmail,需要的是一个字符串数组类型(String[] for extras like EXTRA_EMAIL and EXTRA_CC),那么您应该使用putExtra(String, String[]) 来添加附加参数。

发送二进制数据

与发送文本格式的数据类似,构造一个Intent其Action为ACTION_SEND,设定正确的MIME类型,填充数据的URI 到Intent的键值 EXTRA_STREAM中,最后触发该Intent就可以了。共享二进制数据最常用的是图片数据的分享,其他任何的二进制数据都可以分享,只要设定了正确的MIME类型。

示例代码:

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

注意事项:

  1. MIME 类型可以设定为"*/*", 但是这只能匹配能够处理通用数据流的Activities
  2. 目标APP应当有读取Uri 指向的数据的权限,解决办法如下:
    • 将要共享的数据写到外部/共享的存储设备上,例如SD卡,这样所有的APP都可以读取。通过方法Uri.fromFile() 获取该文件的Uri 地址,然后设置到Intent中。请记住,不是所有的APP都能正确识别"file:// "风格的Uri 地址。
    • 通过方法openFileOutput() 将数据保存到自己APP的目录中,权限设置为任何APP可读取( MODE_WORLD_READABLE ),然后调用方法getFileStreamPath() 会返回一个File的类型,最后同样通过方法 Uri.fromFile() 获取到该文件"file:// "风格的Uri 地址
    • 多媒体类型的文件,比如图片,视频文件和音频文件可以通过方法 scanFile()添加到系统的多媒体数据库(MediaStore ), onScanCompleted() 回调函数就会返回"content:// "格式的Uri 地址
    • 图片文件也可以通过方法 insertImage() 添加到系统的多媒体数据库(MediaStore ),函数调用会返回"content:// "格式的Uri 地址
    • 使用ContentProvider来共享您APP的数据,请确保目标APP拥有访问您APP Provider 的正确权限设置(请参照per-URI permissions

发送批量数据

要想批量发送数据,Intent的Action应设置为ACTION_SEND_MULTIPLE ,然后再设置批量数据的URIs 地址列表,MIME 类型随着混合数据格式的不同而不同。比如,您发送3张JPEG 格式的图片,那么MIME 类型仍然是"image/jpeg",如果发送的一系列图片中格式不完全相同,那么MIME 类型就应当设置为通用图片格式"image/*" ,如果您发送的一系列数据中类型都不完全一样,那么MIME 类型就应当设置为通用格式"*/*" 。请注意,"image/*"只匹配能处理任何图片格式的APP,而"*/*" 只能匹配处理通用数据类型的APP。

示例代码

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

如上文所提到的,请确保目标APP有足够的权限来访问Uris地址指向的数据。

参考文摘:

http://developer.android.com/training/sharing/send.html

目前有 1 条留言 其中:访客:1 条, 博主:0 条

  1. www.chaojishop.com : 2012年01月07日19:54:22  -49楼 @回复 回复

    第一次来支持你。

给我留言

留言无头像?


×
腾讯微博