Android 10的分區(qū)存儲(chǔ)
分區(qū)存儲(chǔ)
在Android系統(tǒng)中,分區(qū)存儲(chǔ)是一種用于管理應(yīng)用程序數(shù)據(jù)的存儲(chǔ)機(jī)制。它將設(shè)備的存儲(chǔ)空間劃分為不同的分區(qū),每個(gè)分區(qū)都有不同的用途和訪問權(quán)限。
Android分區(qū)存儲(chǔ)從Android 10(API級別29)開始引入。在此版本之前,Android使用傳統(tǒng)的外部存儲(chǔ)和內(nèi)部存儲(chǔ)來管理應(yīng)用程序的文件和數(shù)據(jù)。從Android 10開始,引入了一種新的存儲(chǔ)模型,稱為分區(qū)存儲(chǔ)。
分區(qū)存儲(chǔ)將應(yīng)用程序的文件和數(shù)據(jù)分為兩個(gè)主要類別:公共存儲(chǔ)和私有存儲(chǔ)。公共存儲(chǔ)是可由多個(gè)應(yīng)用程序訪問的共享存儲(chǔ)空間,例如照片、視頻和音樂等媒體文件。私有存儲(chǔ)是每個(gè)應(yīng)用程序獨(dú)立使用的存儲(chǔ)空間,用于存儲(chǔ)應(yīng)用程序的私有文件和數(shù)據(jù)。
在分區(qū)存儲(chǔ)模型下,應(yīng)用程序默認(rèn)只能訪問其私有存儲(chǔ)空間,而對于公共存儲(chǔ)空間的訪問需要進(jìn)行特殊的權(quán)限申請。這樣可以增強(qiáng)用戶對文件和數(shù)據(jù)的隱私保護(hù),并提高應(yīng)用程序的安全性。
需要注意的是,雖然分區(qū)存儲(chǔ)從Android 10開始引入,但在此之前的版本中仍然可以使用傳統(tǒng)的外部存儲(chǔ)和內(nèi)部存儲(chǔ)模型。因此,開發(fā)者需要根據(jù)目標(biāo)設(shè)備的Android版本來選擇合適的存儲(chǔ)模型。
分區(qū)存儲(chǔ)的背景是為了提高應(yīng)用程序的安全性和隱私保護(hù)。通過將應(yīng)用程序的私有數(shù)據(jù)存儲(chǔ)在內(nèi)部存儲(chǔ)中,可以防止其他應(yīng)用程序?qū)@些數(shù)據(jù)的訪問。而外部存儲(chǔ)則提供了一個(gè)公共的存儲(chǔ)空間,使得應(yīng)用程序可以方便地共享數(shù)據(jù)。
總的來說,Android的分區(qū)存儲(chǔ)機(jī)制為應(yīng)用程序提供了靈活的存儲(chǔ)方式,既保護(hù)了用戶的隱私,又方便了數(shù)據(jù)的共享和傳輸。
分區(qū)存儲(chǔ)目錄
在Android 10中,引入了一種新的存儲(chǔ)訪問模式,稱為分區(qū)存儲(chǔ)。分區(qū)存儲(chǔ)將應(yīng)用的文件和數(shù)據(jù)存儲(chǔ)在應(yīng)用的私有目錄中,以增強(qiáng)用戶隱私和安全性。以下是Android 10分區(qū)存儲(chǔ)目錄的一些常見路徑:
(1) 內(nèi)部存儲(chǔ)私有目錄:/data/data/<package_name>/
這是應(yīng)用的私有目錄,只有應(yīng)用本身可以訪問。在這個(gè)目錄下,應(yīng)用可以存儲(chǔ)私有文件、數(shù)據(jù)庫、緩存等。
(2) 外部存儲(chǔ)私有目錄:/storage/emulated/0/Android/data/<package_name>/
這是應(yīng)用的外部存儲(chǔ)私有目錄,只有應(yīng)用本身可以訪問。在這個(gè)目錄下,應(yīng)用可以存儲(chǔ)私有文件、數(shù)據(jù)庫、緩存等。
(3) 共享外部存儲(chǔ)目錄:/storage/emulated/0/
這是設(shè)備的共享外部存儲(chǔ)目錄,所有應(yīng)用都可以訪問。在這個(gè)目錄下,應(yīng)用可以存儲(chǔ)共享文件、圖片、音頻、視頻等。
需要注意的是,Android 10中的分區(qū)存儲(chǔ)模式對于訪問外部存儲(chǔ)的權(quán)限有一些限制。應(yīng)用需要在清單文件中聲明相應(yīng)的權(quán)限,并且需要?jiǎng)討B(tài)請求用戶授權(quán)才能訪問外部存儲(chǔ)。這樣可以確保用戶對于自己的數(shù)據(jù)有更好的控制權(quán)。
訪問公共目錄
在Android 10及更高版本中,訪問公共目錄需要使用MediaStore或者Storage Access Framework(SAF)來進(jìn)行操作。SAF提供了一種標(biāo)準(zhǔn)的方式來訪問設(shè)備上的公共文件,以增強(qiáng)用戶的隱私和安全性。
1.MediaStore
使用「MediaStore」來訪問公共數(shù)據(jù)。MediaStore是一個(gè)提供對多媒體文件(如圖片、音頻、視頻)和其他文件(如文檔)的訪問的內(nèi)容提供者。以下是使用MediaStore訪問公共數(shù)據(jù)的步驟:
(1) 添加權(quán)限:在AndroidManifest.xml文件中添加以下權(quán)限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
這將允許應(yīng)用程序讀取外部存儲(chǔ)器上的媒體文件。
(2) 查詢公共數(shù)據(jù):使用ContentResolver查詢MediaStore來獲取公共數(shù)據(jù)。例如,要查詢所有的圖片,可以使用以下代碼:
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
do {
// 處理每個(gè)圖片的邏輯
String id = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
// ...
} while (cursor.moveToNext());
cursor.close();
}
這將返回一個(gè)包含圖片的Cursor對象,然后可以遍歷Cursor來處理每個(gè)圖片的邏輯。
(3) 處理數(shù)據(jù):根據(jù)需要處理查詢到的數(shù)據(jù)。例如,可以使用圖片的ID來獲取其內(nèi)容URI,并顯示圖片:
Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Long.parseLong(id));
imageView.setImageURI(imageUri);
這將使用圖片的內(nèi)容URI來設(shè)置ImageView的圖片。
根據(jù)需要,可以使用不同的MediaStore類來訪問其他類型的公共數(shù)據(jù),如音頻、視頻或文檔。
2.SAF
以下是使用「SAF」訪問公共數(shù)據(jù)的步驟:
(1) 請求訪問權(quán)限:首先,你需要在應(yīng)用的清單文件(AndroidManifest.xml)中聲明適當(dāng)?shù)臋?quán)限。例如,如果你想訪問外部存儲(chǔ)器上的公共目錄,你需要添加以下權(quán)限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(2) 啟動(dòng)SAF:當(dāng)你需要訪問公共目錄時(shí),你可以使用Intent啟動(dòng)SAF。例如,如果你想讓用戶選擇一個(gè)文件,你可以使用以下代碼:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);
(3) 處理返回結(jié)果:當(dāng)用戶選擇了一個(gè)文件后,你可以在onActivityResult方法中處理返回的結(jié)果。你可以通過data.getData()方法獲取所選文件的URI。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
Uri uri = data.getData();
// 在這里處理所選文件的URI
}
}
通過以上步驟,你可以在Android 10及更高版本中訪問公共目錄。請注意,訪問公共目錄可能需要用戶的授權(quán),因此你應(yīng)該在代碼中處理授權(quán)請求和用戶的選擇。