MediaStore:安卓多媒体数据库
MediaStore是Android系统提供的媒体数据库信息类。封装了文件、视频、音频、图片、下载的信息,可以用Uri通过ContentProvider方便的查询系统中的这些媒体信息。
MediaProvider负责处理这些查询请求,内部维护SQLite数据库。在系统/packages/providers/目录下,系统中有许多类似的Provider,比如之前介绍的短信查询就是系统内部提供的数据库,它们都是系统Providers维护的。本篇重点关注MediaStore。
1、MediaStore
File集合提供了所有集合的广泛视图,并且不会按MIME类型进行过滤。其它四种集合都是根据基础内容的主要MIME类型组织的,例如image内容基于图片类型建立索引。
1.1、五种内部类
主要类图如下,每个内部类还有自己的类。simpleuml:uml类图生成插件。

1.2、MediaColumns接口
定义了媒体在数据库中的通用字段,每个类别内部都继承这个接口,因为每种媒体类型都有自己的特性。通用定义的一些字段比如:文件名(_display_name)、路径(_data)等:
public interface MediaColumns extends BaseColumns {
/**
* 磁盘上媒体项的绝对文件系统路径。
* Apps可能没有文件系统权限来直接访问此路径。
* 应用程序应尝试使用ContentResolver.openFileDescriptor(Uri,String)来获取访问权限,而不是尝试直接打开此路径。
*/
@Deprecated
public static final String DATA = "_data";
/**
* 磁盘上媒体项目的哈希。
*/
@Deprecated
public static final String HASH = "_hash";
/**
* The size of the media item.
*/
public static final String SIZE = "_size";
/**
* 媒体项目的显示名称。
*/
public static final String DISPLAY_NAME = "_display_name";
/**
* 媒体项目的标题。
*/
public static final String TITLE = "title";
/**
* 首次添加媒体项目的时间。
*/
public static final String DATE_ADDED = "date_added";
/**
* 媒体项目上次修改的时间。
*/
public static final String DATE_MODIFIED = "date_modified";
/**
* 媒体项目的获取时间。
*/
public static final String DATE_TAKEN = "datetaken";
/**
* 媒体项目的MIME类型。
*/
public static final String MIME_TYPE = "mime_type";
...
}下面对每个类别一一详细介绍说明。
2、Audio
Audio是所有音频文件的集合。
2.1、Audio类
Audio UML类图。

2.2、AudioColumns
音频元数据列,除了从MediaColumns接口继承的字段,还定义了Audio数据库专属的其它一些字段,借助这些字段查询Audio数据信息。
public interface AudioColumns extends MediaColumns {
public static final String TITLE_KEY = "title_key";
public static final String DURATION = "duration";
public static final String BOOKMARK = "bookmark";
public static final String ARTIST_ID = "artist_id";
public static final String ARTIST = "artist";
public static final String ALBUM_ARTIST = "album_artist";
@Deprecated
public static final String COMPILATION = "compilation";
public static final String ARTIST_KEY = "artist_key";
public static final String COMPOSER = "composer";
public static final String ALBUM_ID = "album_id";
public static final String ALBUM = "album";
public static final String ALBUM_KEY = "album_key";
public static final String TRACK = "track";
public static final String YEAR = "year";
public static final String IS_MUSIC = "is_music";
public static final String IS_PODCAST = "is_podcast";
public static final String IS_RINGTONE = "is_ringtone";
public static final String IS_ALARM = "is_alarm";
public static final String IS_NOTIFICATION = "is_notification";
public static final String IS_AUDIOBOOK = "is_audiobook";
@Deprecated
public static final String GENRE = "genre";
public static final String TITLE_RESOURCE_URI = "title_resource_uri";
}3、Video
存放视频信息。
3.1、Video类
UML类图如下:

3.2、查询视频
通过MediaStore.Video.Media.EXTERNAL_CONTENT_URI查询视频。
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;完整查询代码片段如下:
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = getContentResolver().query(uri, null, null, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
do {
String _display_name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME));
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
} while (cursor.moveToNext());
}
cursor.close();
}4、Downloads
存放下载管理器中下载的文件记录信息。注意锤子手机出现找不到class的情况,这个和手机系统有关系。

5、Files
共享的文件信息。建议不要使用,这个是功耗非常大的功能,查询所有文件。

6、Images
存放各种图片信息。

参考资料:
Media Data之多媒体数据库(二)MediaProvider

