Android 11 中的儲存空間更新

Android 11 (API 級別 30) 進一步強化平台,為外部儲存空間的應用程式和使用者資料提供更完善的保護。本次發布內容包含多項強化功能,例如原始檔案路徑存取權、媒體的批次編輯作業,以及儲存空間存取架構的更新版 UI。

此外,這個版本也改善了範圍儲存空間,方便開發人員在遷移至這個儲存空間模型後,滿足儲存空間使用案例

強制執行限定範圍儲存空間政策

在 Android 11 上執行但指定 Android 10 (API 級別 29) 的應用程式,仍可要求 requestLegacyExternalStorage 屬性。應用程式可使用這個標記暫時停用與限定範圍儲存空間相關的變更,例如授予不同目錄和不同類型媒體檔案的存取權。將應用程式更新至指定 Android 11 後,系統會忽略 requestLegacyExternalStorage 標記。

維持與 Android 10 的相容性

如果應用程式在 Android 10 裝置上執行時停用限定範圍儲存空間,建議您繼續在應用程式的資訊清單檔案中將 requestLegacyExternalStorage 設為 true。這樣一來,應用程式在搭載 Android 10 的裝置上就能繼續正常運作。

將資料遷移至使用限定範圍儲存空間時可見的目錄

如果應用程式使用舊版儲存空間模型,且先前以 Android 10 或更舊版本為目標,您可能會將資料儲存在應用程式無法存取的目錄中 (啟用限定範圍儲存空間模型時)。在以 Android 11 為目標版本之前,請先遷移資料至與限定範圍儲存空間相容的目錄。

測試限定範圍儲存空間

如要在應用程式中啟用範圍儲存空間,請啟用下列應用程式相容性標記,無論應用程式的目標 SDK 版本和資訊清單標記值為何:

如要停用限定範圍儲存空間,改用舊版儲存空間模型,請取消設定這兩個標記。

管理裝置儲存空間

從 Android 11 開始,使用限定範圍儲存空間模型的應用程式只能存取自己的應用程式專屬快取檔案。如果應用程式需要管理裝置儲存空間,請按照這些說明查詢可用空間。

  1. 叫用 ACTION_MANAGE_STORAGE 意圖動作,檢查可用空間。
  2. 如果裝置的可用空間不足,請提示使用者授予應用程式清除所有快取的權限。如要執行此操作,請叫用 ACTION_CLEAR_APP_CACHE 意圖動作。

外部儲存空間的應用程式專屬目錄

從 Android 11 開始,應用程式無法在外部儲存空間上建立專屬應用程式特定目錄。如要存取系統為應用程式提供的目錄,請呼叫 getExternalFilesDirs()

媒體檔案存取權

為方便存取媒體並維護使用者隱私權,Android 11 新增了下列功能。

執行批次作業

為確保裝置之間的一致性,並提升使用者便利性,Android 11 新增了多種方法,讓使用者能更輕鬆地管理媒體檔案群組

使用直接檔案路徑和原生程式庫存取檔案

為了讓應用程式與第三方媒體庫之間的運作更加順暢,Android 11 可讓您透過 MediaStore API 以外的 API,使用直接檔案路徑存取共用儲存空間中的媒體檔案。這些 API 包括:

  • File API。
  • 原生程式庫,例如 fopen()

存取其他應用程式的資料

為保護使用者隱私,在搭載 Android 11 以上版本的裝置上,系統會進一步限制應用程式存取其他應用程式的私有目錄。

存取內部儲存空間的資料目錄

Android 9 (API 級別 28) 開始限制哪些應用程式可讓其他應用程式存取內部儲存空間資料目錄中的檔案。指定 Android 9 以上版本的應用程式「無法」將資料目錄中的檔案設為可供全球存取

Android 11 進一步擴大了這項限制。如果您的應用程式以 Android 11 為目標,即使其他應用程式以 Android 8.1 (API 級別 27) 以下版本為目標,且已將資料目錄中的檔案設為可供全球讀取,您的應用程式仍無法存取其他應用程式資料目錄中的檔案。

存取外部儲存空間的應用程式特定目錄

在 Android 11 中,應用程式無法再存取外部儲存空間中任何其他應用程式的專屬應用程式特定目錄

文件存取限制

為讓開發人員有時間進行測試,以下與儲存空間存取架構 (SAF) 相關的變更,只會在應用程式指定 Android 11 以上版本時生效。

目錄存取權

您無法再使用 ACTION_OPEN_DOCUMENT_TREE 意圖動作要求存取下列目錄:

  • 內部儲存空間磁碟區的根目錄。
  • 裝置製造商視為「穩定可靠的」SD 卡磁碟區根目錄 (無論是模擬用 SD 卡還是可移除的 SD 卡)。磁碟區必須穩定可靠,才能在多數情況下供應用程式順利存取。
  • Download 目錄。

檔案存取權

您無法再使用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUMENT 意圖動作,要求使用者選取下列目錄中的個別檔案:

  • Android/data/ 目錄和其中所有子目錄。
  • Android/obb/ 目錄和其中所有子目錄。

測試變更

如要測試這項行為變更,請按照下列步驟操作:

  1. 使用 ACTION_OPEN_DOCUMENT 動作叫用意圖。確認 Android/data/Android/obb/ 目錄均未顯示。
  2. 執行下列其中一項操作:
  3. 使用 ACTION_OPEN_DOCUMENT_TREE 動作叫用意圖。確認 Download 目錄顯示,且與該目錄相關聯的動作按鈕呈現灰色。

權限

Android 11 針對儲存空間權限進行了下列變更。

指定任何版本

第一個對話方塊會顯示「在設定中允許」連結
圖 1. 應用程式使用限定範圍儲存空間並要求 READ_EXTERNAL_STORAGE 權限時顯示的對話方塊。

無論應用程式的目標 SDK 版本為何,Android 11 都會套用下列變更:

  • 「儲存空間」執行階段權限已重新命名為「檔案和媒體」
  • 如果應用程式未停用限定範圍儲存空間,且要求 READ_EXTERNAL_STORAGE 權限,使用者看到的對話方塊會與 Android 10 不同。如圖 1 所示,對話方塊會指出應用程式正在要求存取相片和媒體。

    使用者可以在系統設定中查看哪些應用程式具有 READ_EXTERNAL_STORAGE 權限。在「設定」>「隱私權」>「權限管理工具」>「檔案和媒體」頁面中,具有這項權限的每個應用程式都會列在「允許存取所有檔案」下方。如果應用程式指定 Android 11 為目標版本,請注意,這項「所有檔案」存取權僅限讀取。如要使用這個應用程式讀取及寫入共用儲存空間中的所有檔案,您必須具備所有檔案存取權

以 Android 11 為目標

如果應用程式指定 Android 11 為目標,WRITE_EXTERNAL_STORAGE 權限和 WRITE_MEDIA_STORAGE 專屬權限都不會提供任何額外存取權。

請注意,在搭載 Android 10 (API 級別 29) 以上版本的裝置上,應用程式不要求任何儲存空間權限,即可改善定義完善的媒體集合,例如 MediaStore.Downloads。進一步瞭解如何在應用程式中處理媒體檔案時,僅要求必要的權限

所有檔案的存取權

大多數需要共用儲存空間存取權的應用程式,都可以依循最佳做法來共用媒體檔案共用非媒體檔案。不過,有些應用程式的主要用途會需要大範圍存取裝置上的檔案,但是採用較能保障隱私權的最佳做法,會降低應用程式的執行效率。為應對上述情況,Android 提供了一款特殊應用程式存取權,稱為「所有檔案存取權」。詳情請參閱管理儲存裝置上所有檔案的指南。

其他資源

如要進一步瞭解 Android 11 的儲存空間異動,請參閱下列資料:

網誌文章

影片