一般 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

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)客户端与服务器端进行数据交互(一、登录服务器端)
  3. Android的轻量级数据库sqlite、以及文件存取byte数组
  4. Android中数据库常见操作实例分析
  5. 在 Android(安卓)上,一个完整的 UDP 通信模块应该是怎样的?
  6. Android分享到微信好友、朋友圈
  7. 一起来学Android(安卓)Studio:(五)导入 jar 包和第三方开源库方法
  8. RIL层源码分析
  9. [置顶] 【Bugly干货分享】关于 Android(安卓)N 那些你不知道的事

随机推荐

  1. Android(安卓)http中文乱码问题
  2. Android(安卓)网络编程 API笔记 - java.n
  3. Android热修复技术
  4. Android视频录制命令screenrecord
  5. Android(安卓)Studio的gradle配置
  6. Android(安卓)实例剖析之 notepad
  7. 【转】Android(安卓)性能优化之内存检测
  8. cocos2d-x 播放视频 on Android
  9. 《第一行代码》-第一次学习笔记(第一章).md
  10. android项目R文件丢失怎么办