1.
如果为intent调用了Intent.createChooser(),那么Android总是会显示可供选择。这样有一些好处:
- 即使用户之前为这个intent设置了默认的action,选择界面还是会被显示。
- 如果没有匹配的程序,Android会显示系统信息。
- 我们可以指定选择界面的标题。
下面是更新后的代码:
Intent sendIntent = new Intent();
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));
2.
分享二进制内容(Send Binary Content)
分享二进制的数据需要结合设置特定的MIME类型,需要在
EXTRA_STREAM`里面放置数据的URI,下面有个分享图片的例子,该例子也可以修改用于分享任何类型的二进制数据:
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类型,但是这仅仅会match到那些能够处理一般数据类型的Activity(即一般的Activity无法详尽所有的MIME类型) - 接收的程序需要有访问URI资源的权限。下面有一些方法来处理这个问题:
- 将数据存储在ContentProvider中,确保其他程序有访问provider的权限。较好的提供访问权限的方法是使用 per-URI permissions,其对接收程序而言是只是暂时拥有该许可权限。类似于这样创建ContentProvider的一种简单的方法是使用FileProvider helper类。
- 使用MediaStore系统。MediaStore系统主要用于音视频及图片的MIME类型。但在Android3.0之后,其也可以用于存储非多媒体类型。
3.
发送多块内容(Send Multiple Pieces of Content)
为了同时分享多种不同类型的内容,需要使用ACTION_SEND_MULTIPLE
与指定到那些数据的URIs列表。MIME类型会根据分享的混合内容而不同。例如,如果分享3张JPEG的图片,那么MIME类型仍然是image/jpeg
。如果是不同图片格式的话,应该是用image/*
来匹配那些可以接收任何图片类型的activity。如果需要分享多种不同类型的数据,可以使用*/*
来表示MIME。像前面描述的那样,这取决于那些接收的程序解析并处理我们的数据。下面是一个例子:
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, "Share images to.."));
4.
更新菜单声明(Update Menu Declarations)
使用ShareActionProvider的第一步,在menu resources对应item中定义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>
这表明了该item的appearance与function需要与ShareActionProvider匹配。此外,你还需要告诉provider想分享的内容。
Set the Share Intent(设置分享的intent)
为了实现ShareActionProvider的功能,我们必须为它提供一个intent。该share intent应该像第一课讲的那样,带有ACTION_SEND
和附加数据(例如EXTRA_TEXT
与 EXTRA_STREAM
)的。使用ShareActionProvider的例子如下:
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);
}
}
也许在创建菜单的时候仅仅需要设置一次share intent就满足需求了,或者说我们可能想先设置share intent,然后根据UI的变化来对intent进行更新。例如,当在Gallery里面全图查看照片的时候,share intent会在切换图片时候进行改变。