AndroidF11 中的儲存空間更新

Android 11 (API 級別 30) 可進一步強化平台,為外部儲存空間的應用程式和使用者資料提供更完善的保護。這個版本推出了幾項強化功能,例如原始檔案路徑存取權、媒體的批次編輯作業,以及 Storage 存取架構的新版 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 中生效:

  • 「Storage」執行階段權限已重新命名為「Files & Media」
  • 如果您的應用程式未停用限定範圍儲存空間功能,並要求 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 的儲存空間變更,請參閱下列資料:

網誌文章

影片