原文地址:http://android.xsoftlab.net/training/building-content-sharing.html

引言

Android应用程序有一项伟大的事情就是它们有可以与其它应用程序交流及整合。为什么不重新使用已经存在于其它APP中的非核心功能呢?

这节课覆盖了一些共同的方式,你可以使用这些方式在两个程序之间使用IntentAPI以及ActionProvider对象发送和接收一些简单的数据。

发送简单的数据给其它APP

当在构造Intent时,必须指定intent要触发的功能。Android定义了包括ACTION_SEND在内的若干功能。你可以猜到,ACTION_SEND表明这个intent可以发送数据从一个activity到另一个activity,甚至是跨进程。如果要发送数据到另一个activity,你需要做的就是指定数据与类型,系统会识别适合接收的activity列表并展示给用户选择,如果有多个的话,或者立即启动activity。相似的,你可以公布你的activity支持接收的数据类型。

在两个应用之间发送接收数据在社会化分享中非常常见。Intent使用户可以更快捷更方便的使用他们喜欢的应用分享信息。

Note:在ActionBar上添加分享按钮的最好方式是使用ShareActionProvider,ShareActionProvider从API 14开始可用。我们会在课程Adding an Easy Share Action中讨论ShareActionProvider。

发送文本内容

上图:在手持设备上ACTION_SEND意图选择器的对话框。

ACTION_SEND的大多数功能是发送文本从一个activity到另一个activity。举个例子,系统内置的浏览器可以将当前页面的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以及MIME类型text/plain,那么Android系统会运行它;如果有多个应用程序匹配到,系统会展示一个选择对话框,来允许用户选在一个APP。

然而,如果你调用的是Intent.createChooser(),那么它返回的Intent版本将总是会展示一个选择器对话框。这里是它的一些优势:

  • 虽然用户原先已经选择过这个Intent的默认应用,但是对话框还是需要每次都出现。
  • 如果没有程序匹配到,那么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)));

它的结果会向上图显示的那样。

你可以给Intent设置一些附加标准:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT。如果接收的应用程序不是被设计为使用它们的话,程序会忽略这些附加标准。

Note:一些e-mail的应用程序,比如Gmail,会期望接收附加的字符串数组,类似EXTRA_EMAIL和EXTRA_CC,使用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类型,但是这只是会匹配有能力处理通用数据流的Activity。
  • 匹配到的应用程序需要有权限来访问Uri所指向的资源。下面是推荐的方式:
    • 将数据存储到你自己的ContentProvider中,确保其他APP有正确的权限访问你的提供者。提供访问的首选机制是使用per-URI permissions,它是一个临时的只授权接收到的应用程序访问的权限。可以像使用FileProvider帮助类那样简单的创建一个ContentProvider。
    • 使用系统的MediaStore,MediaStore会首先瞄准视频,音频,以及图像MIME类型,然而从Android 3.0之后,它还可以存储非媒体类型。文件可以通过scanFile()被插入到MediaStore之后,scanFile()所提供的onScanCompleted()回调方法会传递一个适用于分享的content://风格的Uri。注意,一旦将内容被添加到MediaStore中,那么设备上的任何APP都可以访问它。

发送多个内容片段

如果要分享内容的多个片段的话,使用ACTION_SEND_MULTIPLE行为可以将Uri分别指向的内容整合成为一个列表。MIME类型取决于你分享的内容。举个例子,如果要分享3张JPEG图片,使用的类型仍然是”image/jpeg”。如果混合了多个类型的话,应该使用”image/*”来匹配一个可以处理任何类型的Activity。如果你分享出一个类型很多样的内容的话,你应该使用”*/*”。就像原先陈述的,这取决于接收的应用程序解析并处理你的数据:

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所指向的数据,那些接收的应用程序可以访问。

Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP相关推荐

  1. Android官方开发文档Training系列课程中文版:目录

    原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...

  2. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

    原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...

  3. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  4. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建

    原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要 ...

  5. Android官方开发文档Training系列课程中文版:分享文件之配置文件共享

    原文地址:http://android.xsoftlab.net/training/secure-file-sharing/index.html 导言 APP经常需要给其它的APP提供一个或多个文件. ...

  6. Android官方开发文档Training系列课程中文版:分享文件之分享一个文件

    原文地址:http://android.xsoftlab.net/training/secure-file-sharing/share-file.html 一旦APP设置通过URI的方式共享文件,你需 ...

  7. Android官方开发文档Training系列课程中文版:Android的安全建议

    原文地址:http://android.xsoftlab.net/training/articles/security-tips.html Android系统内置的安全策略可以有效的降低应用程序的安全 ...

  8. Android官方开发文档Training系列课程中文版:线程执行操作之线程间通讯

    原文地址:http://android.xsoftlab.net/training/multiple-threads/communicate-ui.html 上节课我们学习了如何启动一项由Thread ...

  9. Android官方开发文档Training系列课程中文版:后台加载数据之处理CursorLoader的查询结果

    原文地址:http://android.xsoftlab.net/training/load-data-background/handle-results.html 就像上节课所说的,我们应该在onC ...

最新文章

  1. windows defender和windows firewall
  2. Oracle11gExp导出空表方法
  3. python 慕课课程笔记(一)
  4. 关于Static控件背景透明时文本覆盖重影的问题
  5. find函数matlab_从零开始的matlab学习笔记——(39)find函数
  6. 精通 RPM 之校验篇_检验篇_检测篇
  7. 知识复习:nlp算法面试汇总
  8. Linux 基础——权限管理命令chown、chgrp
  9. adobe flash java_Adobe 发布最后的 Flash 更新:官方强烈建议立即卸载
  10. u-boot之ARM920T的start.S分析
  11. Centos7搭建Frps服务端的教程
  12. 2020.3.23 bugku(21-25)
  13. Java日历设计思路
  14. 杭州随笔之欲把西湖比西子
  15. HTML+CSS大作业HTML5期末大作业 旅游酒店网站设计——旅游酒店服务预订(1页) web网页设计—— 出游
  16. Springboot中设置response直接在线打开文件
  17. Tpflow V6.0.6 正式版发布
  18. bzoj-3131 淘金
  19. Vue实现app中搜索页面的炫酷搜索热词布局样式
  20. 利用数组统计班级学生成绩(入门级)

热门文章

  1. 总结一些调试的心得,ES7243
  2. 我学机械的可以转嵌入式吗?
  3. 被该死的Openssl编译嘲讽了一个下午
  4. 鸿蒙系统能不能用了,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  5. 模块化加载_谈谈双亲委派模型的第四次破坏-模块化
  6. python 交互式可视化库_Python 交互式可视化库
  7. 数据结构之二叉树:折纸问题——11
  8. LeetCode 1273. 删除树节点(拓扑排序/DFS)
  9. LeetCode 1267. 统计参与通信的服务器(计数)
  10. 剑指Offer - 面试题47. 礼物的最大价值(动态规划)