Android 多媒体之MediaStore

时间:2021-05-30 20:35:49

概述

MediaStoreandroid系统提供的一个多媒体数据库,专门用于存放多媒体信息的,通过ContentResolver即可对数据库进行操作。如下是其结构:

Android 多媒体之MediaStore

结构图解:

MediaStore.Files: 共享的文件,包括多媒体和非多媒体信息
MediaStore.Audio: 存放音频信息
MediaStore.Image: 存放图片信息
MediaStore.Vedio: 存放视频信息

每个内部类中都又包含了Media,Thumbnails和相应的MediaColumns,分别提供了媒体信息,缩略信息和 操作字段。

使用

都是通过 ContentResolverCursor 来操作的,比如查询图片:

//获取cursor
Cursor cursor = this.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // URI,可以有多种形式
null,
null,
null,
null);
//图片路径所在列的索引
int indexPhotoPath = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
while (cursor.moveToNext()) {
//打印图片的路径
Log.i("uri:", cursor.getString(indexPhotoPath));
}
cursor.close();

参数解析:

public final Cursor query(
Uri uri, //数据资源路径
String[] projection, //查询的列
String selection, //查询的条件
String[] selectionArgs, //条件填充值
String sortOrder){} //排序依据

数据库字段

MediaStore 提供了所有数据库中的字段 宏定义,操作起来十分方便。

比如:

INTERNAL_CONTENT_URI; //内部库URI
EXTERNAL_CONTENT_URI;//外部库URI
CONTENT_TYPE;//内容提供者类型
DEFAULT_SORT_ORDER;//排序方式

有些URI系统并没有提供,但是提供了相关方法,比如,操作文件的URI写法

MediaStore.Files.getContentUri("external");
Uri.parse("content://media/external/files");//和上面的写法等价

更多用法参考: 关于MediaStore.Files
android 多媒体数据库详解

结合LoaderManager

一般,我们都是实现 LoaderManager.LoaderCallbacks<Cursor>接口,

public Loader<Cursor> onCreateLoader(int id, Bundle args) {}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {}
public void onLoaderReset(Loader<Cursor> loader) {}

通过 参数 Cursor data来遍历 获取相关信息,更多用法参考:Android获取MediaStore的所有照片

Android加载器LoaderManager.loaderCallbacks

扩展阅读

更多关于 MediaStore 的源码分析,参考系列文章:

Android-源码分析之MediaScanner[1]

简化MediaStore操作的第三方库:

MediaFacade