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 版本和資訊清單標記值為何:
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 推出了下列與儲存空間權限相關的變更。
指定任何版本
無論應用程式的目標 SDK 版本為何,以下變更都會在 Android 11 中生效:
- Storage 執行階段權限已重新命名為「檔案和媒體」。
如果您的應用程式未停用限定範圍儲存空間,且要求
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 的儲存空間變更,請參閱下列資料: