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 中,應用程式將無法再存取外部儲存空間中任何其他應用程式專屬應用程式專屬目錄中的檔案。

文件存取權限制

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

目錄存取權

您無法再使用 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 的儲存空間異動內容,請參閱下列資料:

網誌文章

影片