内容共享 之 发送内容到其他的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_EMAIL
和EXTRA_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指定的数据的权限。
- 内容共享 之 发送内容到其他的APP
- 【Android Training - 06】分享数据内容 [Lesson 1 - 发送分享的数据到其他App]
- 【Android Training - 06】分享数据内容 [Lesson 1 - 发送分享的数据到其他App]
- Android分享其他APP的内容之文本和图片
- VC++ 取得 其他app的ListBox 内容
- 共享内容使用到的ftok()
- IOS App开启iTunes文件共享 去documen的内容
- 如何实现程序调用系统邮件,发送app中抓取的xml图片和内容到指定的邮箱
- Sending Content to Other Apps 将内容发送到其他应用程序
- 发送带html标记的内容到后台
- build docker镜像时发送到deamo的内容过大问题
- ITUNE清理“其他”的内容
- Android | 将内容分享到自己的app
- 共享内容
- 线程之间的共享内容
- 线程之间共享的内容
- 内容共享 之 增加一个简便的分享按钮
- 把表单内容发送到邮箱
- SSP Timer Job Distribution List Import Job was not run
- Bubble(1)
- EBP
- Sublime Text 2 tips for Python and web developers
- hbase中filter查询例子
- 内容共享 之 发送内容到其他的APP
- 智能算法浅介----模拟退火,遗传算法,禁忌搜索,神经网络等
- android中图片异步加载工具类 ---利用双缓存技术和线程池
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eproductServ
- hbase条件查询
- Dijkstra_And_Ford
- 字节对齐方式引起的血案
- AT91SAM9X5-EK开发板从NFS启动
- 使用Aspose.Pdf从PDF文件中获取个别的附件