Android MediaProvider详解(基础篇)「终于解决」

Android (96) 2023-06-20 12:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Android MediaProvider详解(基础篇)「终于解决」,希望能够帮助你!!!。

我们都知道Android有四大组件,Activity、Service、BroadcastReceiver、ContentProvider。MediaProvider就是Android系统中的一个数据库,类似的还有TelephonyProvider、CalendarProvider、ContactsProvider,这些数据库的源码都在/packages/providers/目录下。

其中MediaProvider又称多媒体数据库,保存了手机上存储的所有文件的信息。如果做过多媒体相关的应用的同学应该对下面这段代码很熟悉,这是典型的查询file信息的代码段。

private static final String[] FILES_PRESCAN_PROJECTION = new String[] {
    Files.FileColumns._ID, // 0
    Files.FileColumns.DATA, // 1
    Files.FileColumns.FORMAT, // 2
    Files.FileColumns.DATE_MODIFIED, // 3
};

Cursor c = null;
String where = null;
String[] selectionArgs = null;

// query for only one file
where = Files.FileColumns.DATA + "=?";
selectionArgs = new String[] { filePath };

if (c != null) {
    c.close();
    c = null;
}
c = mMediaProvider.query(mFilesUri, FILES_PRESCAN_PROJECTION,
    where, selectionArgs, MediaStore.Files.FileColumns._ID, null);

这个数据库存放在/data/data/com.android.providers.media/databases当中,里面有两个数据库:internal.db和external.db,internal.db存放的是系统分区的文件信息,开发者是没法通过接口获得其中的信息的,而external.db存放的则是我们用户能看到的存储区的文件信息,即包含了手机内置存储,还包含了SD卡。

如果你的手机root了,你可以用adb pull命令把这两个数据库拖到本地,使用SQLite Expert 这个软件查看其中的内容:
Android MediaProvider详解(基础篇)「终于解决」_https://bianchenghao6.com/blog_Android_第1张

Android MediaProvider详解(基础篇)「终于解决」_https://bianchenghao6.com/blog_Android_第2张

下一篇我准备写一下MediaProvider的原理,理解了原理开发者就会少犯一些错误,比如:为什么我下载了一个图片而在图库中找不到(UC浏览器有几个版本就一直有这个问题,我反馈给他们好几次也不鸟我,我从此就不再用UC浏览器了),重启手机以后才能看到。

发表回复