大多數需要共用儲存空間存取權的應用程式,都可以依循最佳做法來共用媒體檔案和共用非媒體檔案。不過,有些應用程式的核心用途需要大範圍存取裝置上的檔案,此時採用較能保障隱私權的儲存空間最佳做法,卻會降低應用程式的存取效率。為了因應上述情況,Android 提供了一款特殊應用程式存取權,稱為「所有檔案存取權」。
舉例來說,防毒應用程式的主要用途可能是需要定期掃描不同目錄中的多個檔案。如果這項掃描作業需要反覆與使用者互動,才能使用系統檔案選擇器選取目錄,便會導致使用者體驗不佳。即使您的應用程式有其他用途,例如用做檔案管理員程式、備份與還原應用程式,以及文件管理應用程式,您也需要考慮類似情況。
要求所有檔案存取權
應用程式可以按照下列步驟,要求使用者授予所有檔案存取權:
- 在資訊清單中宣告
MANAGE_EXTERNAL_STORAGE
權限。 - 請使用
ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
意圖動作,將使用者導向系統設定頁面,以便他們為應用程式啟用下列選項:「允許存取管理所有檔案」。
如要判斷應用程式是否已獲得 MANAGE_EXTERNAL_STORAGE
權限,請呼叫 Environment.isExternalStorageManager()
。
MANAGE_EXTERNAL_STORAGE 允許的作業
MANAGE_EXTERNAL_STORAGE
權限可授予以下權限:
讀取和寫入共用儲存空間中的所有檔案。
存取
MediaStore.Files
資料表的內容。存取 USB 即插即用型 (OTG) 硬碟和 SD 卡的根目錄。
寫入所有內部儲存空間目錄,但無法寫入
/Android/data/
、/sdcard/Android
和/sdcard/Android
的大多數子目錄。此寫入權限包括直接檔案路徑存取權。即使應用程式獲得這項權限,仍無法存取屬於其他應用程式的應用程式專屬目錄,因為在儲存空間磁碟區中,這類目錄會顯示為
Android/data/
的子目錄。
如果應用程式具有 MANAGE_EXTERNAL_STORAGE
權限,即可透過 MediaStore
API 或直接檔案路徑存取這些額外的檔案與目錄。但是,當使用 Storage Access Framework 時,只有在不具備 MANAGE_EXTERNAL_STORAGE
權限也能存取檔案或目錄的情況下,您才可以這麼做。
叫用其他應用程式的儲存空間管理活動
在 Android 12 (API 級別 31) 以上版本中,如果應用程式具有 MANAGE_EXTERNAL_STORAGE
權限和 QUERY_ALL_PACKAGES
權限,例如檔案管理應用程式,可以使用 getManageSpaceActivityIntent()
,以將使用者導向其他應用程式的自訂空間管理活動。
getManageSpaceActivityIntent()
方法會使用套件名稱和要求代碼,並傳回下列其中一個值:
PendingIntent
,如果含有指定套件名稱的應用程式定義了自訂「管理空間」活動,如檔案管理應用程式呼叫getManageSpaceActivityIntent()
方法,即可叫用傳回的意圖,將使用者導向自訂活動。null
,如果含有指定套件名稱的應用程式並未定義「管理空間」活動。
啟用 MANAGE_EXTERNAL_STORAGE 進行測試
如要瞭解 MANAGE_EXTERNAL_STORAGE
權限對應用程式的影響,您可以啟用權限進行測試。請在連接至測試裝置的機器上執行下列指令,以便展開測試:
adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow
Google Play 通知
本節說明開發人員在 Google Play 發布應用程式後所看到的通知。
為了限制大範圍存取共用儲存空間的行為,Google Play 商店已更新政策,用來評估以 Android 11 (API 級別 30) 以上版本為目標的應用程式,以及透過 MANAGE_EXTERNAL_STORAGE
權限要求「所有檔案存取權」的應用程式。這項政策已於 2021 年 5 月生效。
當應用程式指定 Android 11 以上版本為目標,並宣告 MANAGE_EXTERNAL_STORAGE
權限時,Android Studio 會出現 Lint 警告 (如圖 1 所示)。這則警告是要提醒您,Google Play 商店的政策對該權限的使用情況設有限制。
MANAGE_EXTERNAL_STORAGE
權限的 Google Play 政策。
請僅在應用程式無法善用 Storage Access Framework 或 Media Store API 等較能保障隱私權的 API 時,才要求 MANAGE_EXTERNAL_STORAGE
權限。應用程式只能將這項權限用於與核心功能直接相關的許可用途。如果應用程式的用途與以下內容類似,就可能可以要求 MANAGE_EXTERNAL_STORAGE
權限:
- 檔案管理員
- 備份與還原應用程式
- 防毒應用程式
- 文件管理應用程式
- 裝置上的檔案搜尋
- 磁碟與檔案加密
- 裝置間資料遷移