天天看點

Android 存儲空間的最佳實踐 (下)

為了提高檔案的規整程度并讓使用者可以更好地控制他們的檔案,Android 10 為應用引入了名為 "分區存儲" 的新範式。分區存儲改變了應用在外置存儲中儲存和通路檔案的方式,為了幫您遷移應用并支援分區存儲,我們概括了常見用例的最佳實踐并分享給大家。在我們過去的文章推送裡已經向您介紹了處理 媒體類檔案的常見用例和最佳實踐,本篇将繼續帶您了解處理非媒體檔案的用例和最佳實踐,供您參考。

這部分内容描述了處理非媒體檔案的一些常見用例,并概要說明了應用可以使用的方法。我們對下述各種用例在不同系統版本的實踐也做了一個小結圖檔,供您參考:

Android 存儲空間的最佳實踐 (下)

使用 ACTION_OPEN_DOCUMENT intent 來要求使用者通過系統選擇器選擇需要打開的檔案。如果您想要過濾系統選擇器展示給使用者的檔案類型,可以使用 setType() 或 EXTRA_MIME_TYPES。

舉例來說,您可以通過以下代碼找到所有的 PDF、ODT 和 TXT 檔案:

Kotlin 代碼

Java 代碼

如果一個目錄既不是特定應用的目錄,也不是公開共享目錄,那麼它就會被視為舊版存儲位置。如果您的應用建立或使用位于舊版存儲位置的檔案,我們建議您将應用的檔案遷移至可被分區存儲通路的位置,同時對應用進行必要的修改,以使用分區存儲中的檔案。

您的應用需要保留對舊版存儲位置的通路,以便可以将任何檔案遷移至可被分區存儲通路的位置。您應該的使用的方法取決于您應用的目标 API 級别。 

使用 preserveLegacyExternalStorage 标志來 保留舊版存儲模型,這樣您的應用就可以在使用者将應用更新為目标平台為 Android 11 的新版本時遷移使用者資料。

注意:  如果您使用  preserveLegacyExternalStorage ,保持舊存儲模型的效果隻會在使用者解除安裝應用之前有效。如果使用者在運作 Android 11 的裝置上安裝或重裝您的應用,則無論  preserveLegacyExternalStorage  的值是什麼,您的應用都無法停用分區存儲模型。

繼續 停用分區存儲,以便您的應用可以繼續通路運作 Android 10 的裝置上舊版存儲位置中的檔案。

停用分區存儲,以便您可以更輕松地在多個 Android 版本間保持應用行為不變。

當您的應用已經做好遷移的準備時,使用以下方法:

檢查您應用在工作中是否使用了位于 /sdcard/ 目錄或其任何子目錄中的檔案;

将應用的所有私有檔案從現在的 /sdcard/ 下的目錄中移動至 getExternalFilesDir() 方法所傳回的目錄中;

将所有共享的非媒體檔案從現在的 /sdcard/ 下的目錄中移動至 /sdcard/ 目錄下的一個應用專用子目錄;

從 /sdcard/ 目錄移除應用程式的舊存儲目錄。

您可以使用 FileProvider 分享應用的檔案給某個其他應用。而對于那些需要互相之間分享檔案的所有應用,我們推薦為每一個應用使用 内容提供程式,然後在将應用添加到集合中時同步資料。

您應使用的方法取決于需要緩存的檔案類型。

小型檔案或者包含敏感資訊的檔案 : 使用 Context#getCacheDir()

大型檔案或者不包含敏感資訊的檔案 : 使用 Context#getExternalCacheDir()

在您的應用完全相容分區存儲之前,您可以通過以下方法之一停用分區存儲:

目标平台設定為 Android 9 (API level 28) 或更低。

如果您的目标平台為 Android 10 (API level 29) 或者更高版本,将您應用 manifest 中的 requestLegacyExternalStorage 屬性設定為 "true":

注意 : 在您将應用的目标 API 更新為 Android 11 (API level 30) 後,如果應用運作在 Android 11 的裝置上, 系統會忽略 requestLegacyExternalStorage 屬性 。是以您的應用必須為支援分區存儲做好準備,并為使用該裝置的使用者 遷移資料。

為了測試目标 API 為 Android 9 及更低版本的應用在使用分區存儲時的行為,您可以通過設定 requestLegacyExternalStorage 的值設定為 false 來使應用選擇啟用行為。如果要在 Android 11 裝置上進行測試,則還可以使用 應用相容性标志 在使用或不使用分區存儲的情況下測試應用的行為。

了解有關 Android 平台檔案存儲與通路的詳細資訊,請參閱以下資源:

資料和檔案存儲概覽

如果您想了解更多最新關于使用存儲空間的最佳實踐,請查閱 Android 官方中文文檔網站中 Android 存儲用例和最佳做法 部分。