注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/sharing/send.html


当你构造了一个intent,你需要制定你的intent将会“激活”的行为。Andriud定义了一些行为,就像你所料想的一样,这里面就有ACTION_SEND这个行为,它表明了这个intent是将一个数据从一个Activity发送至另一个Activity,甚至这一操作可能会跨进程执行。为了将数据发送中另一个activity,所有你需要做的就是指定这个数据以及它的类型,系统会寻找出于其要求相符合的所有activity,并将它们展现给用户(如果有多个选择);或者直接启动这个activity(只有一个符合的activity)。类似的,你可以将你的activity所能支持的来自其它应用的数据类型在你的清单文件中声明出来。

在应用之间通过intent发送和接收数据在社交分享内容一块最为常用。Intent允许同于使用他们最喜爱的应用快速和简单的分享信息。

Note:

使用ShareActionProvider将一个分享行为添加到一个ActionBar是最好的方法,这在API Level 14及以上的平台上可以使用。ShareActionProvider将会在课程:Adding an Easy Share Action中做进一步讨论。

一). 发送文字内容

最直接和通用的使用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);

如果有一个安装的应用,它的intent过滤器能够匹配ACTION_SEND和"text/plain"的MIME类型,Android就会执行这个应用;如果不止一个应用能够符合要求,系统会展示一个单选对话框(即一个应用选择器),来让用户选择一个应用。如果你为这个Intent调用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所示。

图1. 手持设备上选择器对话框的截图

另外,你可以为Intent设置一下附加选项(extras):EXTRA_EMAILEXTRA_CCEXTRA_BCCEXTRA_SUBJECT等。不过,如果接收intent的应用没有设计成会使用它们,那么什么事情都不会发生。你也可以使用自定义的附加选项,当然只有接收intent的应用笨笨狗狗理解它们才会有效果。一般而言,你会使用被接收intent应用自己定义的附加选项。

Note:

一些Email应用,比如Gmail,会期望一个String[]的附加选项,比如:EXTRA_EMAILEXTRA_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中保存数据,要确保其他应用有正确的权限访问你的Provider。比较推荐的访问机制是使用per-URI permissions,它是临时的,并只将访问权限授权给接收intent的应用。一个简单的方法是使用FileProvider辅助类来创建一个这样的ContentProvider
    • 使用系统的MediaStoreMediaStore主要针对的是视频,音频和图像的MIME类型,然而从Android 3.0(API Level 11)开始,它也能存储非多媒体的数据类型(查看:MediaStore.Files了解更多)。当一个“content://”类型的用来分享的Uri被传递到onScanCompleted()回调函数之后,可以通过使用scanFile()将文件插入到MediaStore中。注意:一旦内容被添加到系统的MediaStore,它将会被设备上任何应用所访问。

三). 发送多组内容

要分享多组内容,使用ACTION_SEND_MULTIPLE行为,和一个指向内容的URI的List。MIME的类型根据你要分享的内容而变化。例如,如果你要分享三张JPEG图片,那么类型仍然是“image/jpeg”。如果是各种图片格式的混合,那么类型就应该是“image/*”,它会寻找能够处理任意格式图片的Activity。仅在你在分享很多种类型的内容时,才应该使用“*/*”。如之前所述,解析和处理数据的行为就要看接收intent的应用了。下面是一个发送多组内容数据的例子:

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

如之前所述,确保提供的URIs所指向的数据是接收intent应用能够有权限访问的数据。

【Android Developers Training】 32. 向其它应用发送简单数据的更多相关文章

  1. 【Android Developers Training】 31. 序言:共享简单数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 97. 序言:访问通讯录数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 100. 使用Intent修改联系人数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 41. 向另一台设备发送文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 108. 使用模拟定位进行测试

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 107. 认知用户当前的行为

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 106. 创建并检测地理围栏

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. Jdk1.6 JUC源码解析(13)-LinkedBlockingQueue

    功能简介: LinkedBlockingQueue是一种基于单向链表实现的有界的(可选的,不指定默认int最大值)阻塞队列.队列中的元素遵循先入先出 (FIFO)的规则.新元素插入到队列的尾部,从队列 ...

  2. Springboot基础篇

    Springboot可以说是当前最火的java框架了,非常适合于"微服务"思路的开发,大幅缩短软件开发周期. 概念 过去Spring充满了配置bean的xml文件,随着spring ...

  3. Hadoop2.6.1中的Reducer实现

    正在考虑怎么方便上传图片 1.Partitioner其是一个抽象类,只有一个抽象方法.其作用是对Reducer产生的中间结果进行分片,以方便将同一分组的数据交给同一个Reducer处理 2.类的继承结 ...

  4. Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]

    1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...

  5. 使用Git上传项目代码到github

    github是一个基于Git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.这对于一般人来说公共仓库就已经足够了.   注册账户以及创建仓库 要想使用gi ...

  6. MySQL索引和查询优化

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅 ...

  7. 五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)

    1. 创建连接串连接本地SQLServer数据库 上节讲到MovieDBContext类,这个类的作用是连接数据库并将Movie对象迁移到数据库记录中.不过你会问一个问题:如何知道这个对象将连接哪个数 ...

  8. 三、 添加视图View(ASP.NET MVC5 系列)

    在这一章节我们可以修改HelloWorldController类,通过使用视图模板来封装处理产生给客户端的HTML响应. 我们将使用Razor View engine来创建视图文件.基于Razor的视 ...

  9. php+ajax发起流程和审核流程(以请假为例)

    上一篇随笔中已经提到如何新建流程,那么现在我们就来看一下如何发起一个流程和审核流程~~~ 先说一下思路: (1)登录用session获取到用户的id (2) 用户发起一个流程 注意:需要写申请事由 ( ...

  10. 连接Oracle数据库的时候报了“Got minus one from a read call”

    (转) 出现这种问题基本上就以下几种原因,可以查一下系统日志看看:1:数据库连接满了,扩大数据库连接池2:所登录的机子IP不在sqlnet.ora内,加入后重启listerner即可3:数据库负载均衡 ...