Android MediaStore是用于访问和管理多媒体内容的系统数据库,它存储了设备上的照片、视频、音频等文件的信息。在使用MediaStore的过程中,我们需要授予一些权限来访问和操作这些多媒体内容。本文将介绍使用Android MediaStore所需的权限,并提供相应的代码示例。

Android MediaStore权限

使用Android MediaStore需要以下权限:

  1. READ_EXTERNAL_STORAGE:允许应用读取设备上的多媒体文件。
  2. WRITE_EXTERNAL_STORAGE:允许应用写入多媒体文件到设备上。

这两个权限都属于存储权限,需要在AndroidManifest.xml文件中进行声明。

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

在Android 10及以上的版本中,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限被分为两个级别:legacyalllegacy级别只允许访问应用自己的目录以及公共目录,而all级别还允许访问其他应用的目录。默认情况下,应用被授予legacy级别的权限。

如果需要在Android 10及以上版本中访问其他应用的目录,需要在AndroidManifest.xml文件中声明requestLegacyExternalStorage属性,并将其值设置为true

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

使用MediaStore访问照片

下面是一个使用MediaStore访问照片的示例:

// 查询照片的Uri和字段
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME };

// 执行查询
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(uri, projection, null, null, null);

// 遍历结果
if (cursor != null && cursor.moveToFirst()) {
    do {
        // 获取照片的ID和名称
        long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
        String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));

        // 根据ID构建照片的Uri
        Uri photoUri = ContentUris.withAppendedId(uri, id);

        // 在此处进行照片的操作,例如显示、复制、删除等
        // ...
    } while (cursor.moveToNext());
}

// 关闭Cursor
if (cursor != null) {
    cursor.close();
}

上述代码首先定义了要查询的照片的Uri和字段,在执行查询之后,通过遍历Cursor获取每张照片的ID和名称,可以根据ID构建照片的Uri,然后进行相应的操作。

使用MediaStore访问视频和音频

类似地,我们也可以使用MediaStore访问视频和音频文件。下面是一个使用MediaStore访问视频和音频的示例:

// 查询视频的Uri和字段
Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] videoProjection = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME };

// 执行查询
Cursor videoCursor = contentResolver.query(videoUri, videoProjection, null, null, null);

// 遍历视频结果
if (videoCursor != null && videoCursor.moveToFirst()) {
    do {
        // 获取视频的ID和名称
        long id = videoCursor.getLong(videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
        String name = videoCursor.getString(videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));

        // 根据ID构建视频的Uri
        Uri videoUri = ContentUris.withAppendedId(videoUri, id);

        // 在此处进行视频的操作,例如播放、上传、编辑等
        // ...
    } while (videoCursor.moveToNext());
}

// 关闭Cursor
if (videoCursor != null) {
    videoCursor.close();
}

// 查询音频的Uri和字段
Uri audioUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] audioProjection = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME };

// 执行查询
Cursor audioCursor = contentResolver.query(audioUri, audioProjection, null, null, null);

// 遍历音频结果
if (audioCursor != null && audioCursor.moveToFirst()) {
    do {
        // 获取音频的ID和名称
        long id = audioCursor.getLong(audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
        String name = audioCursor.getString(audio