ファイル共有の設定

アプリから別のアプリにファイルを安全に提供するには、ファイルへのセキュアなハンドルをコンテンツ 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 属性は、files/images/ サブディレクトリ内のファイルのコンテンツ URI にパスセグメント myimages を追加するよう FileProvider に指示します。

<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

その他の関連情報については、以下をご覧ください。