2023年11月23日 星期四

Android Studio - FileProvider 介紹(一百一十五)

Android Studio - FileProvider 介紹(一百一十五):

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 的出現可以解決檔案共用的問題,提升了檔案文件訪問的安全性。FileProvider 默認就具有生成 content:// 格式的 Uri 的功能,因此我們不需要在代碼中編寫它的子類,幾乎所有的代碼都只需要在 XML 檔中進行配置即可。要配置 FileProvider,我們首先需要在 AndroidManifest.xml 檔中通過 標籤進行聲明,並配置自訂的 android:authorities 屬性。

FileProvider 實現檔共用功能的步驟:
在 AndroidManifest.xml 中聲明 FileProvider
創建一個 xml 檔定義 FileProvider 的路徑
創建一個 file_paths.xml 檔,並定義檔路徑
獲取文件的 Uri
啟動其他應用來處理文件

AndroidManifest.xml:
</manifest>
    <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

指定FileProviderauthority,需要確保它在裝置上是唯一的

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:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path name="root" path="" />
    <files-path name="files" path="images/" />
    <cache-path name="cache" path="" />
    <external-path name="external" path="" />
    <external-files-path  name="external-files" path="" />
    <external-cache-path name="external-cache" path="" />
    <external-media-path name="external-media" path="" />
</paths>

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(檔案名可以自訂),這個檔中的根節點是,在這個節點下設定檔夾。

2023年 11月 23日(Thu)天氣報告
氣溫:44.0°F / 7.0°C @ 07:00
風速:每小時 6公里
降雨機會:2%
相對濕度:百分之 62%
天氣:多雲