如要從您的應用程式安全地提供檔案給其他應用程式,您需要設定應用程式,以內容 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
如需其他相關資訊,請參閱: