管理儲存裝置上的所有檔案

大多數需要共用儲存空間存取權的應用程式,可以遵循共用媒體檔案共用非媒體檔案的最佳做法。不過,有些應用程式的核心用途需要大範圍存取裝置上的檔案,但採用較能保障隱私權的儲存空間最佳做法,卻會降低應用程式的存取效率。為了因應上述情況,Android 提供了一款特殊應用程式存取權,稱為「所有檔案存取權」

比如防毒應用程式的主要用途可能需要定期掃描不同目錄中的多個檔案。如果這項掃描作業需要反覆與使用者互動,才能使用系統檔案選擇器選取目錄,便會導致使用者體驗不佳。即使您的應用程式有其他用途,例如用做檔案管理員程式、備份與還原應用程式,以及文件管理應用程式,您也需要考慮類似情況。

要求所有檔案存取權

應用程式可以按照下列步驟,要求使用者授予所有檔案存取權:

  1. 在資訊清單中宣告 MANAGE_EXTERNAL_STORAGE 權限。
  2. 如要啟用應用程式的以下選項:「允許存取管理所有檔案」權限,請使用 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 商店的政策對該權限的使用情況設有限制。

圖 1 Android Studio 的 Lint 警告,提醒開發人員有關 MANAGE_EXTERNAL_STORAGE 權限的 Google Play 政策。

請僅在應用程式無法善用 Storage Access FrameworkMedia Store API 等較能保障隱私權的 API 時,才要求 MANAGE_EXTERNAL_STORAGE 權限。應用程式只能將這項權限用於與核心功能直接相關的許可用途。如果應用程式的用途與以下內容類似,就可能可以要求 MANAGE_EXTERNAL_STORAGE 權限:

  • 檔案管理工具
  • 備份與還原應用程式
  • 防毒應用程式
  • 文件管理應用程式
  • 裝置上的檔案搜尋
  • 磁碟與檔案加密
  • 裝置間資料遷移