FileProvider,就是 ContentProvider 的一個特殊子類,幫助我們將訪問受限的 file:// URI 轉化爲可以授權共享的 content:// URI。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="my_images" path="images/"/>
...
</paths>
元素必須包含一到多個子元素。這些子元素用於指定共享文件的目錄路徑,必須是這些元素之一:
:內部存儲空間應用私有目錄下的 files/ 目錄,等同於 Context.getFilesDir() 所獲取的目錄路徑;
:內部存儲空間應用私有目錄下的 cache/ 目錄,等同於 Context.getCacheDir() 所獲取的目錄路徑;
:外部存儲空間根目錄,等同於 Environment.getExternalStorageDirectory() 所獲取的目錄路徑;
:外部存儲空間應用私有目錄下的 files/ 目錄,等同於 Context.getExternalFilesDir(null) 所獲取的目錄路徑;
:外部存儲空間應用私有目錄下的 cache/ 目錄,等同於 Context.getExternalCacheDir();
可以看出,這五種子元素基本涵蓋內外存儲空間所有目錄路徑,包含應用私有目錄。同時,每個子元素都擁有 name 和 path 兩個屬性。
其中,path 屬性用於指定當前子元素所代表目錄下需要共享的子目錄名稱。注意:path 屬性值不能使用具體的獨立文件名,只能是目錄名。
name 屬性用於給 path 屬性所指定的子目錄名稱取一個別名。後續生成 content:// URI 時,會使用這個別名代替真實目錄名。這樣做的目的,很顯然是爲了提高安全性。
如果我們需要分享的文件位於同級別目錄下不同的子目錄中,就需要添加多個子元素逐一指定要分享的文件目錄,或者共享他們通用的父目錄也行。