如要安全地提供應用程式檔案給其他應用程式,您必須將應用程式設為提供
檔案的安全控制代碼,採內容 URI 格式。Android
FileProvider 元件會產生內容 URI
產生的檔案。本課程將說明如何新增預設值
在應用程式中實作 FileProvider,以及如何
指定要提供給其他應用程式的檔案
注意:FileProvider 類別屬於
AndroidX 核心程式庫。資訊
如果想在應用程式中加入這個程式庫,請參閱
宣告依附元件。
指定 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 屬性會指定 URI 授權數量
您要用於
FileProvider。
在這個範例中,主機名稱為 com.example.myapp.fileprovider。為自己
指定應用程式的主機名稱
具有「fileprovider」字串的 android:package 值。瞭解詳情
有關權威值,請參閱
內容 URI 和
android:authorities 屬性。
應用程式的 <meta-data> 子元素
<provider> 指向一個 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/ 目錄中的檔案產生內容 URI
內部儲存空間或 files/ 子目錄中的檔案。應用程式產生
檔案的內容 URI,其中包含
<provider> 個元素 (com.example.myapp.fileprovider),
myimages/ 路徑,以及檔案名稱。
舉例來說,如果您根據FileProvider
您必須將檔案的內容 URI
default_image.jpg,FileProvider 會傳回
存取 URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
如需其他相關資訊,請參閱: