android content sharing(分享&doc)
分享简单的数据
通过使用
Intent
APIs和ActionProvider
对象,你可以在两个应用程序之间send
和receive
简单的数据。通过指定动作(action) 打开activity(或者activities),如果只有一个(app)匹配,android系统直接运行该应用,如果多于一个应用匹配,android 系统会显示一个可选的dialog供用户选择
当然,你也可以通过
Intent
对象调用Intent.createChooser()
方法,返回一个可选的对话框,这种方法有一些优点:尽管用户之前已经为intent选择了默认的action,可选应用的对话框(chooser)依旧会显示
如果没有应用匹配,android会显示系统信息
可以为chooser dialog指定title
接受来自其他app的简单数据
( /building apps with content sharing/ sharing simple data / receiving simple data from other apps/)
通过
getIntent()
方法获得Intent
对象,一旦有了该对象,你就可以测试它的内容从而决定下一步做什么。要当心传递过来的数据,你永远不会知道其他app会传递什么样的数据过来。例如:也许会将MIME type设置错误,传递过来的图片太大。并且记得,处理二进制数据不应该在主线程(ui)中进行,应该起一个工作线程。
- 更新UI可以像填充EditText一样简单,也可以像为图片添加滤镜一样复杂。(这特定于你的应用程序下一步将发生什么。it’s really specific to your application what happens next)
添加一个简单的分享动作(share action)
android 4.0 (API Level 14)引进了
AcionProvider
,这使得你可以非常容易的在ActionBar
中添加有效的和对用户友好的分享动作(share action)。更改menu的描述
actionProviderClass
1 | <menu xmlns:android="http://schemas.android.com/apk/res/android"> |
- 设置分享意图(share intent)
1 | private ShareactionProvider mShareActionProvider; |
- 可以在创建menu的时候设置分享意图,也可以在UI变化时设置并且更新分享意图。eg: 在画廊全屏浏览图片,当在图片之间翻转时,分享意图会改变。
分享文件 (share file)
- 官方文档:in all cases, the only secure way to offer a file from your app to another app is to send the receiving app the file’s content URI and grant remporary access permissions to that URI. Content URIs with remporary URI access permissions are secure because they apply only to the app that receives the URI, and they expire auomatically. The Android
FileProvider
component provides the methodgetUriForFile()
for generating a file’s content URI.
if you want to share small amount of text or numeric data between apps, you should send an
Intent
that contains the data. 如上上一节分享简单的数据
所示
FileProvider
类在v4 Support Library
包下。
指定一个文件提供者 specify the fileProvider
- defining a
FileProvider
for your app requires an entry in your manifest. This entry specifies the authority to use in generating content URIs, as well as the name of an XML file that specifies the directories your app can share.
1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
android:authorities
属性指定了用FileProvider
生成的content uris的权威。在自己的app中,指定authority
属性包含android:package
的值并追加fileprovider
字符串。
(可以学习Content URIs
以及android:authorities
属性的文档)<provider>
元素的子元素<meta-data>
指向一个xml文件,该文件指定了你想要分享的文件夹。android:resource
属性指定xml文件的名称和路径,不需要文件的.xml
后缀。
指定可以分享的文件夹
- 一旦在
manifest
文件中添加了FileProvider
,你就需要指定想要分享的文件夹中的文件
1 | // 1. 在res/xml创建一个名为filepaths.xml的文件 |
在该例子中,
<files-path>
标签分享的文件夹在app内部存储的files/
文件夹下。path
属性指定分享files/
的子文件夹images/
。name
属性告知FileProvider
为files/images/
子文件夹添加myimages
的content uris<paths>
元素可以有多个孩子,指定每一个要分享的文件夹。可以使用
<external-path>
元素分享外部存储的文件夹可以使用
<cache-path>
元素分享内部缓存文件夹从
FileProvider
文档中学习更多信息
使用xml文件是唯一一个指定你想分享文件夹的途径。你不能用代码添加文件夹。
- 如果你使用上述方法定义了
FileProvider
,你请求default_image.jpg的content uri,FileProvider
会返回下列内容:
1 | content://com.example.myapp.fileprovider/myimages/default_image.jpg |