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