android content sharing(分享&doc)

发表于:,更新于:,By Sally
大纲
  1. 1. 分享简单的数据
    1. 1.1. 接受来自其他app的简单数据
    2. 1.2. 添加一个简单的分享动作(share action)
  2. 2. 分享文件 (share file)
    1. 2.1. 指定一个文件提供者 specify the fileProvider
    2. 2.2. 指定可以分享的文件夹

分享简单的数据

  • 通过使用IntentAPIs和ActionProvider对象,你可以在两个应用程序之间sendreceive简单的数据。

  • 通过指定动作(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
2
3
4
5
6
7
<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>
  • 设置分享意图(share intent)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private ShareactionProvider mShareActionProvider;
...
@override
public boolean onCreateOptionsMenu(Menu menu) {
// 1. inflate menu resource file.
getMenuInflater().inflate(R.menu.share_menu, menu);
// locate MenuItem with ShareActionProvider
MenuItem item = menu.findItem(R.id.menu_item_share);

// 2. fetch and store ShareActionProvider
mShareActionProvider = (ShareActionProvider)item.getActionProvider();

// return true to display menu
return true;
}

// 3. call to update the share intent
private void setShareIntent(Intent shareIntent) {
if(mShareActionProvider != null) {
mShareActionProvider.setShareIntent(shareIntent);
}
}
  • 可以在创建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 method getUriForFile() 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
2
3
4
5
6
7
8
9
10
11
12
13
14
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">

<application ... >
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">

<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>

</provider>
</application
</manifest>

  • 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
2
3
4
// 1. 在res/xml创建一个名为filepaths.xml的文件
<paths>
<files-path path="images/" name="myimages" />
</paths>
  • 在该例子中,<files-path>标签分享的文件夹在app内部存储的files/文件夹下。path属性指定分享files/的子文件夹images/name属性告知FileProviderfiles/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