Android应用程序间的内容分享机制-----SEND/SEND_MULTIPLE
来源:互联网 发布:西南石油大学软件专业 编辑:程序博客网 时间:2024/05/16 15:00
一、向其他应用发送内容
创建一个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 = newIntent();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 = newIntent();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.手机上的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 = newIntent();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 = newArrayList<Uri>();imageUris.add(imageUri1); // Add your image URIs hereimageUris.add(imageUri2);Intent shareIntent = newIntent();shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);shareIntent.setType("image/*");startActivity(Intent.createChooser(shareIntent, "Share images to.."));
正如前面提到的,要确保URI指向的数据要可以被接收程序访问到。
二、接收其他APP的内容
就象程序可以发送数据给其他程序,所以也可以接收其他程序的数据。想一下用户如何和程序交互,以及想从其他程序接收什么样类型的数据。例如,一个社交程序可能对接收其他程序的文字(比如有趣的网址)感兴趣。Google+ 程序可接收文字和单多张图片。用这个app,用户可以和容易的用Android Gallery中的相片在Google+上发布。
更新Manifest
intent filter会告诉系统程序会打算接收什么。就和前面讲的如何用ACTION_SEND创建intent相似,创建intent filter来接收带有这个操作的intent。在manifest中用元素来来定义一个intent filter。例如,如果程序可接收文字,任何类型的单张图片,或任何类型的多张图片,mainfest应该象:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter></activity>
注意:更多关于intent filters和intetent解决方案请参考Intents and Intent Fileters
当其他程序通过创建intent然后传递给startActivity()来分享上面的类容,你的程序会在intent chooser列表中显示,如果用户选择了你的程序,相应的activity(上面例子中的.ui.MyActivity)将会被启动。然后就由你来在代码和界面中来处理内容了。
处理传入的数据
要处理Intent传递的数据,首先调用getIntent()来获得Intent对象。一旦获得了这个对象,可以通过查看数据来决定接下来怎么做。记住如果activity可以从系统的其他部分启动,比如launcher,那么需要在查看intent的时候考虑这些情况。
void onCreate (Bundle savedInstanceState) { ... // 获得 intent, action 和 MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // 处理发送来的文字 } else if (type.startsWith("image/")) { handleSendImage(intent); // 处理发送来的图片 } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // 处理发送来的多张图片 } } else { // 处理其他intents,比如由主屏启动 } ...}void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // 根据分享的文字更新UI }}void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // 根据分享的图片更新UI }}void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // 根据分享的多张图片更新UI }}
注意:要格外小心的检查传入的数据,你不知道其他程序传进来什么。例如,有可能设置了错的MIME类型,或者图片可能非常大。还要记住,在另外一个线程中处理二进制数据,而不是UI线程。
更新UI可以是像填充EditText一样简单,或者更难一些像在一张图片上添加一个有趣的滤镜。由你的程序来决定接下来会发生什么。
另外4.0之后还有更理想的分享方法: 使用ShareActionProvider分享数据
- Android应用程序间的内容分享机制-----SEND/SEND_MULTIPLE
- Android应用程序间的内容分享机制
- 史上最全:Android 应用程序内容分享详解
- Android 应用程序之间内容分享详解
- Android 应用程序之间内容分享 当不存在能够分享的程序 [整理]
- Android 应用程序之间内容分享详解(一)
- Android 应用程序之间内容分享详解(二)
- Android 应用程序之间内容分享详解(一)
- Android 应用程序之间内容分享详解(二)
- Android 应用程序之间内容分享详解(一)
- Android开发笔记(3) 应用程序之间内容分享详解
- Android 应用程序之间内容分享详解(一)
- Android 应用程序之间内容分享详解(二)
- Android 应用程序之间内容分享详解(一)
- Android 应用程序之间内容分享详解(一)
- Android 应用程序之间内容分享详解(二)
- Android 应用程序之间内容分享详解(一)
- Android 应用程序之间内容分享详解(二)
- 第十届河南 ACM 省赛纪事
- c++第5次作业
- 大学毕业面试(2)
- Session实现购物车(经典)
- java第四章-流程控制
- Android应用程序间的内容分享机制-----SEND/SEND_MULTIPLE
- 6大新奇网站资源,收藏
- photo.scr FTP矿机木马的分析和清理
- java学习笔记(精华)day14总结
- 各种排序算法比较
- spring整合ActiveMQ订阅模式(对象消息发送)
- access函数的用法
- DDD -- 领域驱动设计 -- 到底啥叫“建模”?
- Ubuntu14.04 导航栏消失