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 版本和資訊清單旗標值為何,請啟用下列應用程式相容性標記:
DEFAULT_SCOPED_STORAGE
(預設為所有應用程式啟用)FORCE_ENABLE_SCOPED_STORAGE
(預設為停用所有應用程式)
如要停用限定範圍儲存空間,並改用舊版儲存空間模型,請取消設定兩個旗標。
管理裝置儲存空間
自 Android 11 起,使用限定範圍儲存空間模型的應用程式只能存取自身的應用程式專屬快取檔案。如果您的應用程式需要管理裝置儲存空間,請按照如何查詢免費空間的說明操作。
- 請叫用
ACTION_MANAGE_STORAGE
意圖動作來查看可用空間。 如果裝置的可用空間不足,請提示使用者授予應用程式同意,清除所有快取。如要這麼做,請叫用
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_TREE
或 ACTION_OPEN_DOCUMENT
意圖動作,要求使用者選取下列目錄中的個別檔案:
Android/data/
目錄和其中所有子目錄。Android/obb/
目錄和其中所有子目錄。
測試變更
如要測試此行為變更,請按照下列步驟操作:
- 透過
ACTION_OPEN_DOCUMENT
動作叫用意圖。確認Android/data/
和Android/obb/
目錄並未顯示。 - 執行下列其中一項操作:
- 啟用
RESTRICT_STORAGE_ACCESS_FRAMEWORK
應用程式相容性標記。 - 指定 Android 11 以上版本。
- 啟用
- 透過
ACTION_OPEN_DOCUMENT_TREE
動作叫用意圖。確認顯示Download
目錄,且與目錄相關聯的動作按鈕顯示為灰色。
權限
Android 11 導入了以下與儲存空間權限相關的變更。
指定任何版本
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 的儲存空間異動,請參閱下列資料: