Android 11 分区存储指南

随着 Android 11 的发布,分区存储(Scoped Storage)成为了应用开发中的一个新特性。分区存储旨在提高用户隐私保护,限制应用对文件的访问范围。作为一名经验丰富的开发者,我将指导你如何实现 Android 11 分区存储。

分区存储流程

以下是实现分区存储的流程图:

flowchart TD
    A[开始] --> B{检查API等级}
    B -->|API等级<30| C[使用旧版存储方式]
    B -->|API等级>=30| D[使用分区存储]
    D --> E[配置Manifest]
    E --> F[请求存储访问权限]
    F --> G[使用MediaStore或Storage Access Framework]
    G --> H[管理文件访问]
    H --> I[结束]

详细步骤

1. 检查API等级

首先,检查设备的 API 等级。如果 API 等级小于 30,你可以使用旧版的存储方式。如果 API 等级大于或等于 30,你需要使用分区存储。

2. 配置Manifest

AndroidManifest.xml 文件中,添加必要的权限:

<manifest xmlns:android="
    package="com.example.scopedstorage">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 其他必要的权限 -->

</manifest>

3. 请求存储访问权限

在 Android 11 中,你需要请求存储访问权限。你可以使用以下代码请求权限:

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}

4. 使用MediaStore或Storage Access Framework

在 Android 11 中,你不能直接访问 /storage/emulated/0/ 目录。你需要使用 MediaStoreStorage Access Framework 来访问文件。

使用MediaStore
ContentResolver contentResolver = getContentResolver();
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = contentResolver.query(uri, null, null, null, null);
使用Storage Access Framework
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, PICK_IMAGE_REQUEST);

5. 管理文件访问

在分区存储中,你需要管理文件的访问。你可以使用 FileProvider 来共享文件。

AndroidManifest.xml 中添加 FileProvider
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.example.scopedstorage.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
创建 file_paths.xml
<paths xmlns:android="
    <external-files-path name="my_files" path="." />
</paths>
使用 FileProvider 获取文件的 URI
File file = new File(getExternalFilesDir(null), "example.txt");
Uri contentUri = FileProvider.getUriForFile(this,
        "com.example.scopedstorage.fileprovider", file);

结语

通过以上步骤,你可以实现 Android 11 分区存储。这不仅可以提高用户隐私保护,还可以让你的应用更加安全。希望这篇文章能帮助你更好地理解和实现分区存储。祝你开发顺利!