大多數需要共用儲存空間存取權的應用程式,都可以按照共用媒體檔案和共用非媒體檔案的最佳做法。不過,有些應用程式的主要用途會需要大範圍存取裝置上的檔案,但是採用較能保障隱私權的最佳做法,會降低應用程式的執行效率。為應對上述情況,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
的權限限制。只有當應用程式無法善用 Storage Access Framework 或 Media Store API 等較能保障隱私權的 API 時,才應要求 MANAGE_EXTERNAL_STORAGE
權限。此外,授予應用程式的權限,僅限於在許可範圍內使用,並且必須與其核心功能直接相關。如果應用程式的用途與以下範例類似,就可能取得 MANAGE_EXTERNAL_STORAGE
權限:
- 檔案管理員
- 備份與還原應用程式
- 防毒應用程式
- 文件管理應用程式
- 裝置上的檔案搜尋
- 磁碟與檔案加密
- 裝置間資料遷移