設定檔案分享

若要安全地將檔案中的檔案提供給其他應用程式,您需要設定應用程式,以內容 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。如果是自己的應用程式,請指定包含應用程式的 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

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