我们都知道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 filewhere = 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 这个软件查看其中的内容:

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

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Android(安卓)FTP客户端使用,快速上传文件
  4. Qt之Qt5.7开发Android应用程序小试牛刀
  5. 第三课:android发送短信
  6. Android(安卓)WebView JavaScript交互
  7. Android(安卓)如何使用internal 和 hidden API
  8. Android(安卓)Studio 编译release的aar、jar包
  9. Android(安卓)N共享文件报错:android.os.FileUriExposedException

随机推荐

  1. android遇到的BUG
  2. 什么是android(What Is Android?)
  3. Android(安卓)JNI入门第五篇——基本数据
  4. Android AIDL 跨进程服务 Proxy/Stub
  5. Android如何获取多媒体文件信息
  6. Android ViewPager与WP Pivot的视图对比
  7. Anatomy of an Android Application - 剖
  8. Android(安卓)Permission中英对照
  9. 手机和平板之外——带你理解跨设备的Andr
  10. 使用MediaRecorder录制音频