Android(安卓)分享 - 向其它 App 发送数据
一般 Android 应用中都会有分享功能,可以将一些内容通过社交平台分享给自己的朋友,通常可以用友盟或者bmob等专门的分享平台来做,但 Android 其实也内置了分享功能。
看文档的意思内置分享功能貌似只能分享到手机上已安装 App 平台上,不能分享如微博、QQ空间等平台,如果有这种需求,就不适用了。
向其它 App 发送简单数据
发送文本内容
ACTION_SEND 最常用的功能估计就是从一个 Activity 向另一个 Activity 发送文本内容了。例如,内置的浏览器应用就可以分享当前浏览网页的 URL 给其它应用。这在通过邮件或社会化网络向朋友分享一篇文章或站点时会很有用,下面是个示例:
Intent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, "分享内容.");sendIntent.setType("text/plain");startActivity(sendIntent);
如果只有一个应用的 filter 能匹配上 ACTION_SEND 并且其 MIME 类型是 text/plain,系统会运行该应用;如果超过一个应用符合条件,系统将运行一个对话框供用户选择运行哪一个应用。
然而,如果你以 Intent 对象为参数调用 Intent.createChooser() 方法,系统总是会显示应用选择器,这种方式有几个优势:
- 即使用户为该 Intent 选择了默认应用,选择器仍然会弹出
- 如果没有匹配的应用,Andorid 会显示一条系统消息
- 你可以为选择器对话框指定一个标题
下面是修改后的代码
Intent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, "分享内容.");sendIntent.setType("text/plain");startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
另外,你也可以附带一些额外的数据:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT,如果接收应用没有设计如何使用它们,这些数据将会被忽略。
发送二进制内容
二进制内容也可以通过 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 为“*/*”,但这样只会匹配能处理通用数据流的 activities
- 略
发送多个数据
如果要一次性分享多个数据,需要使用 ACTION_SEND_MULTIPLE 的 action 并携带一个以多个数据 URI 为元素的 list 对象。MIME 类型根据你要分享的内容来定,例如,如果要分享3个 JPEG 图片,则 MIME 类型仍然是“image/jpeg”;如果是混合的图片,则类型为“image/*”以匹配能处理任意类型图片的 Activity;你应该只在分享多种文件类型时设置为“*/*”。
下面是示例程序:
ArrayList imageUris = new ArrayList();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, "图片分享.."));
快速分享
在 Android 4.0(API 14) 以上版本在 ActionBar 上通过 ActionProvider 实现一个快速分享是很容易的事,在使用 ShareActionProvider 时,你只需要提供分享意图,它会帮你完成接下来的工作。
注意: ShareActionProvider 只能在 API 14及以上版本中使用。
菜单定义
要使用 ShareActionProvider,只需要在菜单资源文件中相应的菜单项 中定义 android:actionProviderClass
属性,如下代码所示:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item_share" android:showAsAction="ifRoom" android:title="Share" android:actionProviderClass= "android.widget.ShareActionProvider" /> ...menu>
除了上面的代码,还需要指定要分享的内容。
设置分享意图
为了让 ShareActionProvider 正常工作,你需要提供一个分享意图(Intent),该意图与上面提到分享 Intent 的一样,带有 ACTION_SEND action 及 EXTRA_TEXT 和 EXTRA_STREAM 等额外数据。
要指派分享 Intent,首先找到对应的 MenuItem;接下来调用 MenuItem.getActionProvider() 方法获取到 ShareActionProvider 实例;最后分享动作中调用 setShareIntent() 方法完成分享。
下面是示例程序:
private ShareActionProvider mShareActionProvider;...@Overridepublic boolean onCreateOptionsMenu(Menu menu) { // Inflate menu resource file. getMenuInflater().inflate(R.menu.share_menu, menu); // Locate MenuItem with ShareActionProvider MenuItem item = menu.findItem(R.id.menu_item_share); // Fetch and store ShareActionProvider mShareActionProvider = (ShareActionProvider) item.getActionProvider(); // Return true to display menu return true;}// Call to update the share intentprivate void setShareIntent(Intent shareIntent) { if (mShareActionProvider != null) { mShareActionProvider.setShareIntent(shareIntent); }}
更多关于 ShareActionProvider 的讨论,请参考 Action Views and Action Providers 。
参考
- Sharing Simple Data
- Sending Simple Data to Other Apps
更多相关文章
- 一句话锁定MySQL数据占用元凶
- Android(安卓)客户端与服务器端进行数据交互(一、登录服务器端)
- Android的轻量级数据库sqlite、以及文件存取byte数组
- Android中数据库常见操作实例分析
- 在 Android(安卓)上,一个完整的 UDP 通信模块应该是怎样的?
- Android分享到微信好友、朋友圈
- 一起来学Android(安卓)Studio:(五)导入 jar 包和第三方开源库方法
- RIL层源码分析
- [置顶] 【Bugly干货分享】关于 Android(安卓)N 那些你不知道的事