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

大多數需要共用儲存空間存取權的應用程式,都可以按照共用媒體檔案共用非媒體檔案的最佳做法。不過,有些應用程式的主要用途會需要存取裝置上的檔案,但是採用較能保障隱私權的最佳做法,會降低應用程式的執行效率。為了因應上述情況,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 硬碟和 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 警告,提醒您 Google Play 政策針對 MANAGE_EXTERNAL_STORAGE 的權限限制。

使用 Storage Access FrameworkMedia Store API 等較能保障隱私權的 API,如果應用程式無法善用以上 API,才應要求 MANAGE_EXTERNAL_STORAGE 權限。此外,授予應用程式的權限,僅限於在許可範圍內使用,並且必須與其核心功能直接相關。如果應用程式的用途與以下範例類似,就可能取得 MANAGE_EXTERNAL_STORAGE 權限:

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