溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 10中怎么實現分區存儲

發布時間:2021-06-26 14:47:10 來源:億速云 閱讀:402 作者:Leah 欄目:云計算

Android 10中怎么實現分區存儲

引言

隨著Android系統的不斷演進,Google在Android 10(API級別29)中引入了分區存儲(Scoped Storage)的概念。這一變化旨在改善用戶隱私和數據安全,同時簡化開發者的文件管理。分區存儲的核心思想是將應用的文件訪問權限限制在特定的范圍內,從而減少應用對用戶數據的濫用。

本文將詳細介紹Android 10中分區存儲的實現方式,包括其背景、工作原理、適配方法以及常見問題的解決方案。通過本文,開發者可以更好地理解如何在Android 10及更高版本中實現分區存儲,并確保應用在未來的Android版本中保持兼容性。

1. 分區存儲的背景

1.1 為什么需要分區存儲?

在Android 10之前,應用可以通過READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE權限訪問設備的整個外部存儲空間。這種設計雖然方便了開發者,但也帶來了嚴重的安全和隱私問題。惡意應用可以輕松訪問用戶的照片、視頻、文檔等敏感數據,甚至可以在用戶不知情的情況下修改或刪除這些文件。

為了解決這些問題,Google在Android 10中引入了分區存儲機制。分區存儲的主要目標包括:

  • 保護用戶隱私:限制應用對用戶數據的訪問,防止惡意應用濫用權限。
  • 簡化文件管理:通過提供更清晰的文件訪問路徑,減少開發者的復雜性。
  • 提高系統性能:減少不必要的文件掃描和索引,提升系統整體性能。

1.2 分區存儲的核心概念

分區存儲的核心思想是將應用的文件訪問權限限制在特定的范圍內。具體來說,Android 10將外部存儲空間分為以下幾個部分:

  • 應用專屬目錄:每個應用都有一個專屬的目錄(/storage/emulated/0/Android/data/<package_name>),用于存儲應用私有的文件。這些文件只能由應用本身訪問,其他應用無法訪問。
  • 共享存儲空間:共享存儲空間包括照片、視頻、音頻等媒體文件,以及下載、文檔等公共文件。應用可以通過特定的API訪問這些文件,但需要用戶授權。
  • 外部存儲根目錄:應用無法直接訪問外部存儲的根目錄(/storage/emulated/0),除非應用具有特定的權限或用戶明確授權。

2. 分區存儲的工作原理

2.1 應用專屬目錄

在Android 10中,每個應用都有一個專屬的目錄,用于存儲應用私有的文件。這些文件只能由應用本身訪問,其他應用無法訪問。應用專屬目錄的路徑為:

/storage/emulated/0/Android/data/<package_name>

開發者可以通過Context.getExternalFilesDir()方法獲取應用專屬目錄的路徑。例如:

File externalFilesDir = getExternalFilesDir(null);

應用專屬目錄中的文件在應用卸載時會被自動刪除,因此適合存儲臨時文件或應用私有的數據。

2.2 共享存儲空間

共享存儲空間包括照片、視頻、音頻等媒體文件,以及下載、文檔等公共文件。應用可以通過特定的API訪問這些文件,但需要用戶授權。

2.2.1 訪問媒體文件

在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();
}

2.2.2 訪問下載和文檔文件

對于下載和文檔文件,應用可以通過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訪問文件內容。

2.3 外部存儲根目錄

在Android 10中,應用無法直接訪問外部存儲的根目錄(/storage/emulated/0),除非應用具有特定的權限或用戶明確授權。如果應用需要訪問外部存儲的根目錄,可以通過以下方式實現:

  • 請求MANAGE_EXTERNAL_STORAGE權限:應用可以請求MANAGE_EXTERNAL_STORAGE權限,以訪問外部存儲的根目錄。該權限需要用戶手動授權。
  • 使用Storage Access Framework (SAF):應用可以通過SAF請求用戶授權訪問特定的目錄或文件。

3. 適配分區存儲

3.1 啟用分區存儲

在Android 10中,分區存儲默認是啟用的。如果應用的目標SDK版本為Android 10(API級別29)或更高,系統會自動啟用分區存儲。如果應用需要禁用分區存儲,可以在AndroidManifest.xml中添加以下配置:

<application
    android:requestLegacyExternalStorage="true"
    ... >
    ...
</application>

需要注意的是,從Android 11(API級別30)開始,requestLegacyExternalStorage屬性將不再生效,應用必須適配分區存儲。

3.2 適配應用專屬目錄

在適配分區存儲時,開發者應優先使用應用專屬目錄存儲應用私有的文件。應用專屬目錄的路徑可以通過Context.getExternalFilesDir()方法獲取。例如:

File externalFilesDir = getExternalFilesDir(null);

應用專屬目錄中的文件在應用卸載時會被自動刪除,因此適合存儲臨時文件或應用私有的數據。

3.3 適配共享存儲空間

對于共享存儲空間中的文件,開發者應使用MediaStore API或Storage Access Framework (SAF)進行訪問。以下是一些常見的適配場景:

3.3.1 訪問媒體文件

在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();
}

3.3.2 訪問下載和文檔文件

對于下載和文檔文件,應用可以通過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訪問文件內容。

3.4 適配外部存儲根目錄

如果應用需要訪問外部存儲的根目錄,可以通過以下方式實現:

  • 請求MANAGE_EXTERNAL_STORAGE權限:應用可以請求MANAGE_EXTERNAL_STORAGE權限,以訪問外部存儲的根目錄。該權限需要用戶手動授權。
  • 使用Storage Access Framework (SAF):應用可以通過SAF請求用戶授權訪問特定的目錄或文件。

4. 常見問題與解決方案

4.1 如何判斷分區存儲是否啟用?

在Android 10中,分區存儲默認是啟用的。如果應用的目標SDK版本為Android 10(API級別29)或更高,系統會自動啟用分區存儲。開發者可以通過以下代碼判斷分區存儲是否啟用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    // 分區存儲已啟用
} else {
    // 分區存儲未啟用
}

4.2 如何處理文件路徑的變化?

在分區存儲中,應用無法直接訪問外部存儲的根目錄。因此,開發者應避免使用硬編碼的文件路徑,而是使用MediaStore API或Storage Access Framework (SAF)訪問文件。

4.3 如何處理文件權限的變化?

在分區存儲中,應用需要請求特定的權限才能訪問共享存儲空間中的文件。開發者應確保應用在訪問文件時請求相應的權限,并處理用戶拒絕授權的情況。

4.4 如何處理文件URI的變化?

在分區存儲中,應用通過URI訪問文件。開發者應確保應用正確處理文件URI的變化,并在應用卸載或重新安裝時保持文件的訪問權限。

5. 總結

Android 10中的分區存儲機制為開發者提供了更安全和高效的文件管理方式。通過限制應用對用戶數據的訪問,分區存儲有效保護了用戶隱私,同時簡化了開發者的文件管理流程。

在適配分區存儲時,開發者應優先使用應用專屬目錄存儲應用私有的文件,并通過MediaStore API或Storage Access Framework (SAF)訪問共享存儲空間中的文件。此外,開發者還應注意處理文件路徑、權限和URI的變化,以確保應用在未來的Android版本中保持兼容性。

通過本文的介紹,開發者可以更好地理解如何在Android 10及更高版本中實現分區存儲,并確保應用在未來的Android版本中保持兼容性。希望本文能為開發者在適配分區存儲時提供有價值的參考。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女