Android 分享 - 向其它 App 发送数据

一般 Android 应用中都会有分享功能,可以将一些内容通过社交平台分享给自己的朋友,通常可以用友盟或者bmob等专门的分享平台来做,但 Android 其实也内置了分享功能。

看文档的意思内置分享功能貌似只能分享到手机上已安装 App 平台上,不能分享如微博、QQ空间等平台,如果有这种需求,就不适用了。

向其它 App 发送简单数据

Android 分享 - 向其它 App 发送数据_第1张图片

发送文本内容

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 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及以上版本中使用。

Android 分享 - 向其它 App 发送数据_第2张图片

菜单定义

要使用 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);
    }
}

更多关于 ShareActionProvider 的讨论,请参考 Action Views and Action Providers 。

参考

  • Sharing Simple Data
  • Sending Simple Data to Other Apps

你可能感兴趣的:(Android)