一般 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<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, "图片分享.."));
快速分享
在 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;
...
@Override
public 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 intent
private void setShareIntent(Intent shareIntent) {
if (mShareActionProvider != null) {
mShareActionProvider.setShareIntent(shareIntent);
}
}