FileProvide 是在Android 7.0 出現的新特性,它是 ContentProvider 的子類,可以通過創建一個 content://格式的 Content URI 並賦予臨時的檔存取權限來代替 File URI 實現檔共用。但在 Android 10 開始引入了分區存儲的概念,Android 11 開始強制執行,FileProvider 類是 AndroidX 核心庫的一部分,也就是以前可以任意的訪問SD卡下任意目錄,Android 11 上則不能隨意訪問,除了 /sdcard/Android/data/ 應用包名目錄下的內容外,其它目錄都已禁止訪問,音樂、視頻、照片、下載目錄、文件(Music、Video、DCIM、Download、Document)下的檔需要向使用者申請許可權,允許後才可訪問。
Android Studio FileProvider |
FileProvider 實現檔共用功能的步驟:
在 AndroidManifest.xml 中聲明 FileProvider
創建一個 xml 檔定義 FileProvider 的路徑
創建一個 file_paths.xml 檔,並定義檔路徑
獲取文件的 Uri
啟動其他應用來處理文件
AndroidManifest.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> |
paths下標籤和路徑介紹:
序號 |
標籤名 |
對應API |
1 |
android:name |
指定FileProvider的類別名,通常使用 androidx.core.content.FileProvider / androidx.support.v4.content.FileProvider |
2 |
android:authorities |
指定FileProvider的authority,需要確保它在裝置上是唯一的 |
3 |
android:exported |
設定為false,表示該FileProvider只能被本應用程式存取 |
4 |
android:grantUriPermissions |
設定為true,表示授予其他應用程式對該FileProvider傳回的Uri的臨時存取權限 |
5 |
<meta-data> |
標籤用於指定FileProvider的路徑設定檔,這裡是@xml/file_paths |
在 AndroidManifest.xml 的編碼中,android:name 屬性通暢配置為 androidx.core.content.FileProvider(如果當前專案基於Android 7.0,則需要配置為android.support.v4.content.FileProvider);android:authorities 屬性是當前應用的授權字串,是其他應用訪問當前應用中文件的憑證;android:exported 屬性工作表示該 FileProvider 是否是公有的,一般情況下都設為 false;android:grantUriPermissions 屬性工作表示是否可以為檔賦予臨時存取權限,一般情況下都設為true。如果我們想要擴展默認的 FileProvider,則 android:name 屬性需要配置為我們自訂的 FileProvider 類的全路徑。
xml/filepaths.xml:
|
Androidx paths下標籤和路徑介紹:
序號 |
標籤名 |
對應API |
對應路徑 |
1 |
files-path |
Context.getFilesDir() |
/data/user/0/com.ttxz.testa/files |
2 |
cache-path |
Context.getCacheDir() |
/data/user/0/com.ttxz.testa/cache |
3 |
external-path |
Environment.getExternalStorageDirectory() |
/storage/emulated/0 |
4 |
external-files-path |
Context.getExternalFilesDir(String type) |
/storage/emulated/0/Android/data/com.ttxz.testa/files |
5 |
external-cache-path |
Context.getExternalCacheDir() |
/storage/emulated/0/Android/data/com.ttxz.testa/cache |
6 |
external-media-path |
Context.getExternalMediaDirs() |
[/storage/emulated/0/Android/media/com.ttxz.testa] |
Android 7.0 的paths下標籤和路徑介紹:
標籤 |
標籤代表路徑 |
path=”files”代表路徑 |
root-path |
設備的根目錄 |
/files/* |
files-path |
內部存儲空間應用私有目錄下的 files/ 目錄,等同於context.getFilesDir() |
context.getFilesDir()+/files/* |
cache-path |
內部存儲空間應用私有目錄下的 cache/ 目錄,等同於context.getCacheDir() |
context.getCacheDir()+/files/* |
external-path |
外部存儲空間根目錄,等同於Environment.getExternalStorageDirectory() |
Environment.getExternalStorageDirectory()+/files/* |
external-files-path |
外部存儲空間應用私有目錄下的 files/ 目錄,等同於context.getExternalFilesDirs() |
context.getExternalFilesDirs()+/files/* |
external-cache-path |
外部存儲空間應用私有目錄下的 cache/ 目錄,等同於getExternalCacheDirs() |
getExternalCacheDirs()+/files/* |
為了讓其他應用可以訪問當前應用下的檔,我們還需要配置哪些資料夾可以被訪問,這個步驟也是在 XML 檔中配置的。我們需要在專案的 /res/xml 資料夾下創建一個路徑設定檔,命名為 filepaths.xml(檔案名可以自訂),這個檔中的根節點是
沒有留言:
張貼留言