MediaStore:安卓多媒体数据库

QuibblerQuibbler 2020-05-24 约 11 分钟 1778 次阅读

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之多媒体数据库(一)数据库结构分析

        Media Data之多媒体数据库(二)MediaProvider

        Media Data之多媒体数据库(三)MediaStore

        Android使用MediaStore获取手机上的文件

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w