Android - 分享内容 - 给其他APP发送内容

时间:2022-09-06 16:10:12

创建一个intent时,必须要指定intent将要触发的操作。Android定义了很多操作,包括ACTION_SEND,就象可以猜到的一样,表示intent是把数据从一个activity发送给另一个,就算是跨界。要发送数据给其他activity,值需要指定数据和它的类型,系统会识别可兼容的接收activity然后展示给用户(如果有多个选择)或者立刻启动activity(如果只有一个选择)。相似的,也可以通过在manifest中设置来注册你的activity可以接收其他程序的哪些数据类型。

用intent在程序之间发送和接收数据是最常用的社会化分享。Intent让用户可以快速的分享信息并且容易的使用他们喜欢的程序。

注意:最好的添加分享操作到Actionbar的方法是使用ShareActionProvider,在API等级14之后可用。ShareActionProvider会在后面讨论。

发送字符串内容

使用ACTION_SEND时最常用和简单的操作是发送字符串内容从一个activity到另一个。例如,内置的浏览器app可以以字符串的形式分享当前显示网页的URL给任何程序。这对于通过邮件和社交网络和朋友分享文章或网页时很有用。这里有一些代码实现了这种分享:

 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调用Intent.createChooser(),Android会总是显示选择对话框。这有一些好处:

  • 就算用户选择了这个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)));

结果对话框如图1

Android - 分享内容 - 给其他APP发送内容

图1.手机上的ACTION_SEND intent截屏

也可以为intent设置一些其他的信息:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT。然而,如果接收的程序没有打算用他们,什么都不会发生。也可以自定义extras,但是没有任何影响除非接收程序能解析他们。最典型的是,使用接收程序自定义的extras。

注意:一些email程序,比如Gmail,期望获得String[]类型的EXTRA_EMAIL,EXTRA_CC等,使用putExtra(string, string[])来把他们加入intent。

发送二进制内容

二进制数据是使用ACTION_SEND并且设置合适的MIME类型并且在附件数据中的EXTRA_STREAM中放一个指向数据的URI来分享的。这个通常用来分享图片,但是也可以用来分享任何类型的二进制内容:

 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类型为"*/*",但是这样会匹配到很多可以处理数据流的app。
  • 接收的程序需要进入URI指向的数据的权限。有一些方法可以处理:
    • 把数据写到外部存储上(比如SD卡),那样的话所有app都可以读。使用Uri.fromFile()来创建传递给share intent 的URI。然后,注意并不是所有的程序都能处理file://形式的Uri。
    • 在自己程序文件夹下用MODE_WORKD_READABLE模式使用openFileOutput()把数据写入文件,之后再用getFileStreamPath()返回一个File。和前面的差不多,用Uri.fromFile()来为share intent创建一个file://样式的Uri。
    • 象图片,音频,视频这样的媒体文件可以用scanFile()扫描然后加到系统媒体库(MediaStore)中,onScanCompleted()回调方法会返回一个content://样式的Uri,也可以加到share intent中
    • 图片可以用insertImage()来加到媒体库(MediaStore)中,然后会返回一个content://样式的Uri,可以再share intent中使用。
    • 在自己的ContentProvider中保存数据,要确保其他的app有正确的权限来访问你的provider(或者使用per-URI permissions)。

发送多条数据

要发送多条数据,使用ACTION_SNED_MULTIPLE和一个指向数据的URI list。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 - 分享内容

下一篇:Android - 分享内容 - 接收其他APP的内容

Android - 分享内容 - 给其他APP发送内容的更多相关文章

  1. Android - 分享内容 - 接收其他APP的内容

    就象程序可以发送数据给其他程序,所以也可以接收其他程序的数据.想一下用户如何和程序交互,以及想从其他程序接收什么样类型的数据.例如,一个社交程序可能对接收其他程序的文字(比如有趣的网址)感兴趣.Goo ...

  2. android分享到新浪微博,认证&plus;发送微博,

    分享到新浪微博,折腾了大半个月,现在终于弄出来了,心里的那个爽呀,太痛快了,哈哈!! 废话少说,首先是认证, 1.进入新浪微博提供的开放平台http://open.weibo.com/ 注册新浪账号. ...

  3. Android - 分享内容

    Android程序一个很重要地特性是他们可以相互通讯和交互.为什么要重新开发那些不是你程序的核心而且其他程序已经有的功能呢? 这里将要介绍一些使用Intent API和ActionProvider对象 ...

  4. Android中实现APP文本内容的分享发送与接收方法简述

    谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...

  5. iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容

    Spotlight在iOS9上做了一些新的改进, 也就是开放了一些新的API, 通过Core Spotlight Framework你可以在你的app中集成Spotlight.集成Spotlight的 ...

  6. Android基础笔记(十四)- 内容提供者读取联系人

    利用内容提供者读取联系人 利用内容提供者插入联系人 内容观察者的原理 利用内容观察者监听系统应用数据库或者自己应用数据库的变化 利用内容提供者读取联系人 读取联系人相对于读取短信来说就复杂非常多了,我 ...

  7. 分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用

    原文:分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用 毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了.最近新闻总是报道北京的空气污染,各种雾霾,各种PM X ...

  8. 【网站公告】请大家不要发表任何涉及&OpenCurlyDoubleQuote;得到App”的内容

    大家好,今天我们收到来自杭州某某网络科技有限公司的维权骑士团队的邮件,说他们受某某(天津)文化传播有限公司委托,展开维权.园子里有些博主因为学习“得到App”的课程在博客中记了一些笔记,也被维权. 为 ...

  9. android ----- 分享的连接在手机上打开App

    首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]">启动应用程序</a> 这一 ...

随机推荐

  1. 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

    1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...

  2. C&num; 基础(2)

    打开一个解决方案,以.sin后缀名,.csproj是项目文件的后缀名. Console.WriteLine("这是我的第二个项目!");你想显示的内容 Console.ReadKe ...

  3. jemalloc源码结构分析(二):CPU字节对齐算法

    在调用arena_malloc_small过程中,要根据申请内存大小,进行对齐计算,然后分配一个整块儿.算法如下: 1)定义一个SIZE_CLASSES宏,它主要用于生成后面两个表,small_siz ...

  4. OCA读书笔记&lpar;6&rpar; - 配置Oracle网络环境

    6.Configuring the Oracle Network Environment su - grid装grid时自动创建了监听netca--创建新的监听 vi $ORACLE_HOME/net ...

  5. 浏览器兼容汇总(css&plus;js)

      JavaScript 1. HTML对象获取问题 FireFox:document.getElementById("idName");ie:document.idname或者d ...

  6. SQL-41 构造触发器

    题目描述 构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中.CREATE TABLE employees_test(ID IN ...

  7. jQuery 图片裁剪插件 Jcrop

    Jcrop是一个jQuery图片裁剪插件,它能为你的WEB应用程序快速简单地提供图片裁剪的功能.特点如下: 对所有图片均unobtrusively(无侵入的,保持DOM简洁) 支持宽高比例锁定 支持 ...

  8. 我的一起开源网 www&period;17ky&period;net上线了

    .net开源生态的落后,使得.net开发人员所拥有的开源资源比其他语言的开发者少了很多,这也使得笔者很早之前就喜欢收集各种开源项目,经常会去逛codeplex,开源中国社区等网站,同时也喜欢在自己或公 ...

  9. ROS知识(17)----Actionlib使用的例子

    1.Actionlib原理 英文版:DetailedDescription 翻译版:actionlib的身世之谜 2.Actionlib官方教程 Actionlib是ros的重要部件,对于复杂动作的执 ...

  10. Django - 常用配置

    一.logging配置 Django项目常用的logging配置 settings.py LOGGING = { 'version': 1, 'disable_existing_loggers': F ...