隨著Android系統的不斷演進,Google在Android 10(API級別29)中引入了分區存儲(Scoped Storage)的概念。這一變化旨在改善用戶隱私和數據安全,同時簡化開發者的文件管理。分區存儲的核心思想是將應用的文件訪問權限限制在特定的范圍內,從而減少應用對用戶數據的濫用。
本文將詳細介紹Android 10中分區存儲的實現方式,包括其背景、工作原理、適配方法以及常見問題的解決方案。通過本文,開發者可以更好地理解如何在Android 10及更高版本中實現分區存儲,并確保應用在未來的Android版本中保持兼容性。
在Android 10之前,應用可以通過READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
權限訪問設備的整個外部存儲空間。這種設計雖然方便了開發者,但也帶來了嚴重的安全和隱私問題。惡意應用可以輕松訪問用戶的照片、視頻、文檔等敏感數據,甚至可以在用戶不知情的情況下修改或刪除這些文件。
為了解決這些問題,Google在Android 10中引入了分區存儲機制。分區存儲的主要目標包括:
分區存儲的核心思想是將應用的文件訪問權限限制在特定的范圍內。具體來說,Android 10將外部存儲空間分為以下幾個部分:
/storage/emulated/0/Android/data/<package_name>
),用于存儲應用私有的文件。這些文件只能由應用本身訪問,其他應用無法訪問。/storage/emulated/0
),除非應用具有特定的權限或用戶明確授權。在Android 10中,每個應用都有一個專屬的目錄,用于存儲應用私有的文件。這些文件只能由應用本身訪問,其他應用無法訪問。應用專屬目錄的路徑為:
/storage/emulated/0/Android/data/<package_name>
開發者可以通過Context.getExternalFilesDir()
方法獲取應用專屬目錄的路徑。例如:
File externalFilesDir = getExternalFilesDir(null);
應用專屬目錄中的文件在應用卸載時會被自動刪除,因此適合存儲臨時文件或應用私有的數據。
共享存儲空間包括照片、視頻、音頻等媒體文件,以及下載、文檔等公共文件。應用可以通過特定的API訪問這些文件,但需要用戶授權。
在Android 10中,應用可以通過MediaStore
API訪問共享存儲空間中的媒體文件。MediaStore
提供了對照片、視頻、音頻等文件的訪問接口。例如,查詢所有照片的代碼如下:
ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
// 處理照片文件
}
cursor.close();
}
對于下載和文檔文件,應用可以通過Storage Access Framework (SAF)
訪問。SAF提供了一個文件選擇器界面,用戶可以選擇特定的文件或目錄進行訪問。例如,打開文件選擇器的代碼如下:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
在onActivityResult()
方法中,應用可以獲取用戶選擇的文件URI,并通過ContentResolver
訪問文件內容。
在Android 10中,應用無法直接訪問外部存儲的根目錄(/storage/emulated/0
),除非應用具有特定的權限或用戶明確授權。如果應用需要訪問外部存儲的根目錄,可以通過以下方式實現:
MANAGE_EXTERNAL_STORAGE
權限:應用可以請求MANAGE_EXTERNAL_STORAGE
權限,以訪問外部存儲的根目錄。該權限需要用戶手動授權。Storage Access Framework (SAF)
:應用可以通過SAF請求用戶授權訪問特定的目錄或文件。在Android 10中,分區存儲默認是啟用的。如果應用的目標SDK版本為Android 10(API級別29)或更高,系統會自動啟用分區存儲。如果應用需要禁用分區存儲,可以在AndroidManifest.xml
中添加以下配置:
<application
android:requestLegacyExternalStorage="true"
... >
...
</application>
需要注意的是,從Android 11(API級別30)開始,requestLegacyExternalStorage
屬性將不再生效,應用必須適配分區存儲。
在適配分區存儲時,開發者應優先使用應用專屬目錄存儲應用私有的文件。應用專屬目錄的路徑可以通過Context.getExternalFilesDir()
方法獲取。例如:
File externalFilesDir = getExternalFilesDir(null);
應用專屬目錄中的文件在應用卸載時會被自動刪除,因此適合存儲臨時文件或應用私有的數據。
對于共享存儲空間中的文件,開發者應使用MediaStore
API或Storage Access Framework (SAF)
進行訪問。以下是一些常見的適配場景:
在Android 10中,應用可以通過MediaStore
API訪問共享存儲空間中的媒體文件。例如,查詢所有照片的代碼如下:
ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
// 處理照片文件
}
cursor.close();
}
對于下載和文檔文件,應用可以通過Storage Access Framework (SAF)
訪問。例如,打開文件選擇器的代碼如下:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
在onActivityResult()
方法中,應用可以獲取用戶選擇的文件URI,并通過ContentResolver
訪問文件內容。
如果應用需要訪問外部存儲的根目錄,可以通過以下方式實現:
MANAGE_EXTERNAL_STORAGE
權限:應用可以請求MANAGE_EXTERNAL_STORAGE
權限,以訪問外部存儲的根目錄。該權限需要用戶手動授權。Storage Access Framework (SAF)
:應用可以通過SAF請求用戶授權訪問特定的目錄或文件。在Android 10中,分區存儲默認是啟用的。如果應用的目標SDK版本為Android 10(API級別29)或更高,系統會自動啟用分區存儲。開發者可以通過以下代碼判斷分區存儲是否啟用:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 分區存儲已啟用
} else {
// 分區存儲未啟用
}
在分區存儲中,應用無法直接訪問外部存儲的根目錄。因此,開發者應避免使用硬編碼的文件路徑,而是使用MediaStore
API或Storage Access Framework (SAF)
訪問文件。
在分區存儲中,應用需要請求特定的權限才能訪問共享存儲空間中的文件。開發者應確保應用在訪問文件時請求相應的權限,并處理用戶拒絕授權的情況。
在分區存儲中,應用通過URI訪問文件。開發者應確保應用正確處理文件URI的變化,并在應用卸載或重新安裝時保持文件的訪問權限。
Android 10中的分區存儲機制為開發者提供了更安全和高效的文件管理方式。通過限制應用對用戶數據的訪問,分區存儲有效保護了用戶隱私,同時簡化了開發者的文件管理流程。
在適配分區存儲時,開發者應優先使用應用專屬目錄存儲應用私有的文件,并通過MediaStore
API或Storage Access Framework (SAF)
訪問共享存儲空間中的文件。此外,開發者還應注意處理文件路徑、權限和URI的變化,以確保應用在未來的Android版本中保持兼容性。
通過本文的介紹,開發者可以更好地理解如何在Android 10及更高版本中實現分區存儲,并確保應用在未來的Android版本中保持兼容性。希望本文能為開發者在適配分區存儲時提供有價值的參考。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。