Android 11 图库位置详解及代码示例

在 Android 11 中,应用管理媒体文件的方式发生了重大变化。为了保护用户的隐私,Android 11 引入了分区存储(Scoped Storage),这使得应用只能访问自己的私有文件夹和特定的共享存储位置。这篇文章将探讨 Android 11 的图库位置和如何通过代码实现访问。

如何访问图库

在 Android 11 中,应用可以通过 MediaStore API 来访问图库中的图片。MediaStore 提供了一种高效的方法,允许应用列出、插入和更新共享媒体文件。下面是一个示例代码,展示如何查询设备图库中的所有图片。

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

public void fetchGalleryImages() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    String[] projection = {
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media.SIZE
    };

    Cursor cursor = contentResolver.query(uri, projection, null, null, null);
    if (cursor != null) {
        while (cursor.moveToNext()) {
            long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
            String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
            long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE));

            // 处理每个文件
            System.out.println("ID: " + id + ", Name: " + displayName + ", Size: " + size);
        }
        cursor.close();
    }
}

MediaStore API 解释

在以上代码中,我们使用了 ContentResolver 来访问图库。我们定义了一个 Uri,指向外部内容的图像媒体库。通过查询 MediaStore,我们可以获得图像的 _IDDISPLAY_NAMESIZE 等信息。获取的信息可以用于显示图库中的图片。

权限处理

在 Android 11 中,访问媒体文件还需要申请相应的权限。在 AndroidManifest.xml 中添加如下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

并在运行时请求权限:

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

关系图

为了更好地理解 MediaStore 与应用之间的关系,可以参阅以下 ER 图:

erDiagram
    APP {
        string name
        string permissions
    }
    MEDIASTORE {
        string media_id
        string media_type
        string uri
    }
    APP ||--o{ MEDIASTORE : access

表格展示

以下是 Android 11 对于不同媒体类型的支持情况:

媒体类型 支持情况
图片
视频
音频

结论

通过以上的介绍,我们了解到 Android 11 中图库的访问机制,以及如何通过代码实现对图库的查询和操作。新引入的分区存储机制不仅提高了用户的隐私保护,也让开发者在处理媒体文件时更加灵活。希望本文能够帮助开发者在 Android 11 上更加顺利地集成图库功能。通过合理使用 MediaStore API,可以轻松实现多种媒体操作,提高用户体验。