アプリから別のアプリにファイルを安全に提供するには、ファイルへのセキュアなハンドルをコンテンツ URI 形式で提供するようにアプリを構成する必要があります。Android FileProvider
コンポーネントは、XML で指定した仕様に基づいてファイルのコンテンツ URI を生成します。このレッスンでは、FileProvider
のデフォルトの実装をアプリに追加する方法と、他のアプリに提供するファイルを指定する方法について説明します。
注: FileProvider
クラスは AndroidX Core Library の一部です。このライブラリをアプリに含める方法については、依存関係を宣言するをご覧ください。
FileProvider を指定する
アプリに対して FileProvider
を定義するには、マニフェストにエントリが必要です。このエントリでは、コンテンツ URI の生成に使用するオーソリティと、アプリが共有できるディレクトリを指定する XML ファイルの名前を指定します。
次のスニペットは、FileProvider
クラス、認証局、XML ファイル名を指定する <provider>
要素を、マニフェストに追加する方法を示しています。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="androidx.core.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
で生成されたコンテンツ URI に使用する URI 認証局を指定します。この例の認証局は com.example.myapp.fileprovider
です。実際のアプリでは「fileprovider」という文字列を末尾に付けて、アプリの android:package
値で構成される認証局を指定します。認証局の値について詳しくは、コンテンツ URI に関するトピックと、android:authorities
属性のドキュメントをご覧ください。
<provider>
の <meta-data>
子要素は、共有するディレクトリを指定する XML ファイルをポイントします。android:resource
属性は、ファイルのパスと名前です(.xml
拡張子を除く)。このファイルのコンテンツについては、次のセクションで説明します。
共有可能なディレクトリを指定する
FileProvider
をアプリ マニフェストに追加したら、共有するファイルを含むディレクトリを指定する必要があります。ディレクトリを指定するには、まず、プロジェクトの res/xml/
サブディレクトリに filepaths.xml
ファイルを作成します。このファイルで各ディレクトリに XML 要素を追加して、ディレクトリを指定します。次のスニペットは、res/xml/filepaths.xml
の内容の例を示しています。また、内部ストレージ領域の files/
ディレクトリのサブディレクトリを共有する方法も示しています。
<paths> <files-path path="images/" name="myimages" /> </paths>
この例では、<files-path>
タグは、アプリの内部ストレージの files/
ディレクトリ内のディレクトリを共有します。path
属性は、files/
の images/
サブディレクトリを共有します。name
属性は、FileProvider
に対して、files/images/
サブディレクトリのファイルのコンテンツ URI にパスセグメント myimages
を追加するよう指示します。
<paths>
要素には複数の子を指定して、それぞれ異なる共有ディレクトリを指定できます。<files-path>
要素のほか、<external-path>
要素を使用して、外部ストレージでディレクトリを共有できます。また、<cache-path>
要素を使用すると、内部キャッシュ ディレクトリでディレクトリを共有できます。共有ディレクトリを指定する子要素について詳しくは、FileProvider
リファレンス ドキュメントをご覧ください。
注: 共有ディレクトリを指定するには、必ず XML ファイルを使用します。プログラムでディレクトリを追加することはできません。
これで、アプリの内部ストレージの files/
ディレクトリにあるファイル、または files/
のサブディレクトリにあるファイルに対して、コンテンツ URI を生成する FileProvider
の完全な仕様を利用できるようになりました。アプリがファイルのコンテンツ URI を生成するときに、<provider>
要素で指定されたオーソリティ(com.example.myapp.fileprovider
)、パス myimages/
、ファイル名が含まれます。
たとえば、このレッスンのスニペットに従って FileProvider
を定義し、ファイル default_image.jpg
のコンテンツ URI をリクエストすると、FileProvider
によって次の URI が返されます。
content://com.example.myapp.fileprovider/myimages/default_image.jpg
その他の関連情報については、以下をご覧ください。