| page.title=Setting Up File Sharing |
| trainingnavtop=true |
| @jd:body |
| |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <!-- table of contents --> |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#DefineProvider">Specify the FileProvider</a></li> |
| <li><a href="#DefineMetaData">Specify Sharable Directories</a></li> |
| </ol> |
| |
| <h2>You should also read</h2> |
| <ul> |
| <li><a href="{@docRoot}guide/topics/data/data-storage.html">Storage Options</a></li> |
| <li><a href="{@docRoot}training/basics/data-storage/files.html">Saving Files</a> |
| </ul> |
| |
| </div> |
| </div> |
| |
| <p> |
| To securely offer a file from your app to another app, you need to configure your app to offer |
| a secure handle to the file, in the form of a content URI. The Android |
| {@link android.support.v4.content.FileProvider} component generates content URIs for |
| files, based on specifications you provide in XML. This lesson shows you how to add the default |
| implementation of {@link android.support.v4.content.FileProvider} to your app, and how to |
| specify the files you want to offer to other apps. |
| </p> |
| |
| <p class="note"> |
| <strong>Note:</strong> The {@link android.support.v4.content.FileProvider} class is part of the |
| <a href="{@docRoot}tools/support-library/features.html#v4">v4 Support Library</a>. For information |
| about including this library in your application, see |
| <a href="{@docRoot}tools/support-library/setup.html">Support Library Setup</a>. |
| </p> |
| |
| <h2 id="DefineProvider">Specify the FileProvider</h2> |
| <p> |
| Defining a {@link android.support.v4.content.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. |
| </p> |
| <p> |
| The following snippet shows you how to add to your manifest the |
| <code><a href="{@docRoot}guide/topics/manifest/provider-element.html" |
| ><provider></a></code> element that specifies the |
| {@link android.support.v4.content.FileProvider} class, the authority, and the |
| XML file name: |
| </p> |
| <pre> |
| <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></pre> |
| <p> |
| In this example, the <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#auth" |
| >android:authorities</a></code> attribute specifies the URI authority |
| that you want to use for content URIs generated by the |
| {@link android.support.v4.content.FileProvider}. |
| In the example, the authority is <code>com.example.myapp.fileprovider</code>. For your own |
| app, specify an authority consisting of the app's |
| <code><a href="{@docRoot}guide/topics/manifest/manifest-element.html#package" |
| >android:package</a></code> value with the string "fileprovider" appended to it. To learn more |
| about the authority value, see the topic |
| <a href="{@docRoot}guide/topics/providers/content-provider-basics.html#ContentURIs" |
| >Content URIs</a> and the documentation for the |
| <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#auth" |
| >android:authorities</a></code> attribute. |
| </p> |
| <p> |
| The <code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html" |
| ><meta-data></a></code> child element of the |
| <code><a href="{@docRoot}guide/topics/manifest/provider-element.html" |
| ><provider></a></code> points to an XML file that specifies the directories you want to |
| share. The <code>android:resource</code> attribute is the path and name of the file, without |
| the <code>.xml</code> extension.The contents of this file are described in the next section. |
| </p> |
| <h2 id="DefineMetaData">Specify Sharable Directories</h2> |
| <p> |
| Once you have added the {@link android.support.v4.content.FileProvider} to your app manifest, |
| you need to specify the directories that contain the files you want to share. To specify the |
| directories, start by creating the file <code>filepaths.xml</code> in the <code>res/xml/</code> |
| subdirectory of your project. In this file, specify the directories by adding an XML element for |
| each directory. The following snippet shows you an example of the contents of |
| <code>res/xml/filepaths.xml</code>. The snippet also demonstrates how to share a subdirectory |
| of the <code>files/</code> directory in your internal storage area: |
| </p> |
| <pre> |
| <paths> |
| <files-path path="images/" name="myimages" /> |
| </paths></pre> |
| <p> |
| In this example, the <code><files-path></code> tag shares directories within the |
| <code>files/</code> directory of your app's internal storage. The <code>path</code> attribute |
| shares the <code>images/</code> subdirectory of <code>files/</code>. The <code>name</code> |
| attribute tells the {@link android.support.v4.content.FileProvider} to add the path segment |
| <code>myimages</code> to content URIs for files in the <code>files/images/</code> subdirectory. |
| </p> |
| <p> |
| The <code><paths></code> element can have multiple children, each specifying a different |
| directory to share. In addition to the <code><files-path></code> element, you can |
| use the <code><external-path></code> element to share directories in external storage, and |
| the <code><cache-path></code> element to share directories in your internal cache |
| directory. To learn more about the child elements that specify shared directories, see the |
| {@link android.support.v4.content.FileProvider} reference documentation. |
| </p> |
| <p class="note"> |
| <strong>Note:</strong> The XML file is the only way you can specify the directories you want to |
| share; you can't programmatically add a directory. |
| </p> |
| <p> |
| You now have a complete specification of a {@link android.support.v4.content.FileProvider} |
| that generates content URIs for files in the <code>files/</code> directory of your app's |
| internal storage or for files in subdirectories of <code>files/</code>. When your app generates |
| a content URI for a file, it contains the authority specified in the |
| <code><a href="{@docRoot}guide/topics/manifest/provider-element.html" |
| ><provider></a></code> element (<code>com.example.myapp.fileprovider</code>), |
| the path <code>myimages/</code>, and the name of the file. |
| </p> |
| <p> |
| For example, if you define a {@link android.support.v4.content.FileProvider} according to the |
| snippets in this lesson, and you request a content URI for the file |
| <code>default_image.jpg</code>, {@link android.support.v4.content.FileProvider} returns the |
| following URI: |
| </p> |
| <pre> |
| content://com.example.myapp.fileprovider/myimages/default_image.jpg</pre> |
| |