intent调用了Intent.createChooser(),那么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));
分享二进制的数据需要结合设置特定的MIME类型,需要在EXTRA_STREAM里面放置数据的URI
我们可以使用*/*
这样的方式来指定MIME类型,但是这仅仅会match到那些能够处理一般数据类型的Activity
接收的程序需要有访问URI资源的权限,可以将数据存储在ContentProvider中或者使用MediaStore系统。
指定FileProvider
android:authorities字段指定了希望使用的Authority,该Authority针对于FileProvider所生成的content URI
<provider>
下的<meta-data>
指向了一个XML文件,该文件指定了我们希望共享的目录路径
指定可共享目录路径
<paths>
<files-path path="images/" name="myimages" />
</paths>
“name”属性字段告知FileProvider在“files/images/”子目录中的文件的Content URI添加路径分段(path segment)标记:“myimages”。
<files-path>
标签共享的是在我们应用的内部存储中“files/”目录下的目录
<external-path>
标签共享的是位于外部存储的目录
Content URI将会包含下列信息:
路径“myimages/”;
文件的名字。
事例:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
因为客户端应用程序所收到的所有数据只有文件的Content URI而已。由于URI不包含目录路径信息,客户端应用程序无法查询或打开任何服务端应用程序的其他文件。
openFileDescriptor()方法返回一个文件的ParcelFileDescriptor对象。客户端应用程序从该对象中获取FileDescriptor对象,然后利用该对象读取这个文件了