設定檔案分享

如要從您的應用程式安全地提供檔案給其他應用程式,您需要設定應用程式,以內容 URI 的形式提供檔案的安全句柄。Android FileProvider 元件會根據您在 XML 中提供的規格,為檔案產生內容 URI。本課程將說明如何在應用程式中新增 FileProvider 的預設實作方式,以及如何指定要提供給其他應用程式的檔案。

注意:FileProvider 類別是 AndroidX Core Library 的一部分。如要進一步瞭解如何在應用程式中加入這個程式庫,請參閱「宣告依附元件」。

指定 FileProvider

如要為應用程式定義 FileProvider,您必須在資訊清單中加入項目。這個項目會指定產生內容 URI 的授權,以及指定應用程式可共用目錄的 XML 檔案名稱。

下列程式碼片段示範如何在資訊清單中加入 <provider> 元素,指定 FileProvider 類別、權威機構和 XML 檔案名稱:

<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。針對您自己的應用程式,請指定權限,其中包含應用程式的 android:package 值,並附加字串「fileprovider」。如要進一步瞭解權威值,請參閱「內容 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 將路徑區段 myimages 新增至 files/images/ 子目錄中檔案的內容 URI。

<paths> 元素可以有多個子項,每個子項都會指定要共用的不同目錄。除了 <files-path> 元素之外,您還可以使用 <external-path> 元素來共用外部儲存空間中的目錄,以及使用 <cache-path> 元素來共用內部快取目錄中的目錄。如要進一步瞭解指定共用目錄的子元素,請參閱 FileProvider 參考說明文件。

注意:您只能透過 XML 檔案指定要共用的目錄,無法以程式輔助方式新增目錄。

您現在已擁有 FileProvider 的完整規格,可為應用程式內部儲存空間的 files/ 目錄或 files/ 子目錄中的檔案產生內容 URI。當應用程式為檔案產生內容 URI 時,會包含 <provider> 元素 (com.example.myapp.fileprovider) 中指定的權限、路徑 myimages/ 和檔案名稱。

舉例來說,如果您根據本課程中的程式碼片段定義 FileProvider,並要求 default_image.jpg 檔案的內容 URI,FileProvider 會傳回下列 URI:

content://com.example.myapp.fileprovider/myimages/default_image.jpg

如需其他相關資訊,請參閱: