新四季網

android開發從零開始(Android11開發者常見問題)

2023-08-13 01:18:47

我們在 Android 10 中首次引入了 "分區存儲" 的概念,旨在保護應用和用戶數據並減少文件混亂。自此之後我們收到了開發者們的寶貴建議,這些建議有助於我們對該功能的持續優化,非常感謝大家!基於反饋,我們在 Android 11 上做了一些值得注意的改進。例如,我們啟用了對媒體文件的 直接文件路徑訪問功能,用於改善現有代碼和程序庫的兼容性。我們理解許多應用在採取分區存儲方案前需要有周密的方案,以便持續支撐現有用戶的訪問,確保符合當前存儲方案的最佳實踐以及向後兼容性。

基於與開發者們的探討和在開發者論壇上的活躍討論,我們準備了這份有關存儲的常見問題和解答,以幫助您更好地了解分區存儲的各種能力、行為變化和一些限制等。我們在過去的文章推送裡發布過關於 Android 存儲方案的最佳實踐,您可以先回顧一下最佳實踐的這篇 文章。

分區存儲允許應用通過 File API 使用文件路徑訪問文件嗎?

我們意識到某些應用會通過代碼或程序庫直接訪問媒體文件路徑。因此,在 Android 11 上,擁有可讀取外部存儲權限的應用,均可在分區存儲環境中通過文件路徑訪問文件。在 Android 10 的設備上,除非在 manifest 中通過主動聲明 requestLegacyExternalStorage 屬性來選擇停用分區存儲,否則上述方法是無效的。

為了確保不同 Android 版本間的連續性,如果您應用的目標版本是 Android 10 或者是更高版本,您應該選擇不啟用。更多詳細信息,請參閱文末相關閱讀 Android 存儲方案的最佳實踐上下篇。

與媒體存儲 API 相比,文件路徑訪問的性能表現如何?

性能表現非常依賴具體應用場景。對於像視頻播放這樣的擁有順序讀取的操作,文件路徑訪問的性能表現與媒體存儲相差無幾。但是在隨機讀寫的情境下,採取文件路徑的方法最多可慢一倍。為了最快、最穩定的讀寫,我們推薦您使用 Media Store API。

我的應用需要廣泛地訪問共享存儲,存儲訪問框架是我唯一的選擇嗎?

存儲訪問框架 (簡稱 "SAF") 用於用戶授予對目錄和文件的訪問權限,但是需要您注意的是,SAF 對某些目錄的授權仍存在限制,例如根目錄和 Android/data 目錄。雖說大多數應用在存儲訪問時都可以通過我們最佳實踐的方式去實現,例如使用 SAF 或媒體存儲 API,但在某些應用場景下可能會需要更廣泛地訪問共享存儲,亦或是無法通過最佳實踐來有效地訪問。針對上述情況,我們增加了 MANAGE_EXTERNAL_STORAGE 權限,允許程序訪問外部存儲上的所有文件 (除了 Android/data 和 Android/obb 目錄)。我們在 7 月發布了一個 Google Play 政策更新,提到了關於存儲的相關內容,請點擊 這篇微信文章 查看。

哪些類別的應用應該申請 MANAGE_EXTERNAL_STORAGE 權限?

MANAGE_EXTERNAL_STORAGE 權限適用於核心應用場景需要廣泛地訪問設備上的文件的情況,但使用分區存儲的最佳實踐無法高效地實現此功能的那些應用。當然,列出所有可能的應用場景是不切實際的,但其包括了文件管理器、備份和還原、反病毒程序或生產力文件編輯器等使用場景。

使用 Storage Access Framework (存儲訪問框架),是否需要 Google Play 的政策批准?

Storage Access Framework (存儲訪問框架,簡稱 SAF) 從 Android 4.4 開始就已經存在。通過 SAF 訪問文件時,會讓用戶參與文件選擇,從而使用戶可以更好地控制文件的訪問。Google Play 上沒有與之相關的政策。

與 Android 10 相比,在 Android 11 上使用 SAF 會有其他限制嗎?

目標版本為 Android 11 (API 級別為 30) 並使用 SAF 的應用,將不會被授予某些目錄訪問權限,例如 SD 卡上的根目錄和下載目錄。無論是哪個目標 SDK,都無法在 Android 11 上通過存儲訪問框架訪問 Android/data 和 Android/obb 目錄。訪問 官方文檔 了解關於這些限制和測試相關行為的方法。

應用該如何測試分區存儲的變化?

通過這些 兼容性標誌,應用可以測試與直接文件路徑訪問或媒體存儲 API 相關的分區存儲行為。還有另一個 兼容性標誌,也可用來測試使用存儲訪問框架訪問某些路徑時的限制。

分區存儲中的應用,是否僅限於將文件寫入其應用 data 目錄上?

在分區存儲中,應用可以將 媒體項添加 到媒體存儲集合。媒體存儲會根據文件類型,將文件放置於組織有序的文件夾中,例如 DCIM、Movies 和 Download 等。對於所有此類文件,應用可以繼續通過文件 API 來訪問。得益於系統為每個媒體存儲文件賦予了應用屬性,應用不需要有存儲權限也可以讀寫到它們最初提供給媒體存儲的文件。

Data Column 棄用之後,有沒有對此功能的其他使用建議?

在 Android 10 上,位於分區存儲環境中的應用無法通過文件路徑訪問文件。為了與這一設計保持一致,我們隨後廢棄了 DATA column。根據大家的反饋,即需要使用已有的 native 代碼或程序庫,Android 11 現已支持在分區存儲中的應用訪問文件路徑的功能。相應地,DATA Column 實際上在某些情況下其實是有用的。為了在媒體存儲中插入和更新,使用分區存儲的應用應使用 DISPLAY_NAME 和 RELATIVE_PATH Column,它們不再需要使用 DATA Column 來完成此功能。當讀取磁碟中文件的媒體存儲實例時,DATA Column 將具備有效的文件路徑,該路徑可被文件 API 或 NDK 文件程序庫使用。但應用要準備處理任何關於此類操作帶來的 I/O 錯誤,而且不應該假設文件始終是可用的。

對於選擇退出分區存儲的應用,它們何時開始必須兼容分區存儲?

在運行 Android 11 或更高版本的設備上。當目標版本被設置為 Android 11 或更高版本時,應用便會被放入到分區存儲中。

建議使用什麼方法來遷移分區存儲之外的數據?

preserveLegacyExternalStorage 標記允許應用在升級系統時保留原有存儲權限,即使是升級至 Android 11。需要注意的是,在 Android 11 上這個標記對新安裝的應用起不到任何作用。將目標版本設為 Android 11 之前,請修改代碼以適配分區存儲。請參閱文末相關閱讀 Android 存儲方案的最佳實踐上下篇,來獲取數據遷移最佳實踐的相關信息吧。

針對某些軟體包安裝程序 (例如應用商店) 需要訪問 Android/obb 目錄,是否有任何例外情況?

持有 REQUEST_INSTALL_PACKAGES 權限的應用可以訪問其他應用的 Android/obb 目錄。請注意,此權限享有籤名級別的保護。

我們希望您計劃適配分區存儲時這份 FAQ 能為您提供一些幫助。請點擊閱讀原文或查看文末相關閱讀文章,了解我們的最佳實踐文檔。

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了