ファイル共有の設定

あるアプリのファイルを別のアプリに安全に提供するには、コンテンツ URI の形式でファイルを安全に処理できるようにアプリを設定する必要があります。Android FileProvider コンポーネントでは、XML で指定した仕様に基づいてファイルのコンテンツ URI が生成されます。このレッスンでは、FileProvider のデフォルトの実装をアプリに追加する方法と、他のアプリに提供するファイルを指定する方法について説明します。

注: FileProvider クラスは AndroidX Core Library の一部です。このライブラリをアプリに含める方法については、依存関係の宣言をご覧ください。

FileProvider を指定する

アプリに対して FileProvider を定義するには、マニフェストにエントリが必要です。このエントリによって、コンテンツ URI の生成に使用する認証局と、アプリの共有ディレクトリを指定する XML ファイルの名前が指定されます。

次のスニペットは、<provider> クラス、認証局、XML ファイル名を指定する FileProvider 要素を、マニフェストに追加する方法を示しています。

    <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

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