打开小米的文件管理器,我们很快会看到如下图所示的界面:

其中,会把各种文件分类显示。并且显示出每种文件的个数。

这是怎么做到的呢?当然不是每次启动都查询sdcard和应用程序data目录文件啦,那样实在是太慢太愚蠢了。因为android框架的MediaStore已经为我们提供了相应的功能。对于各种类型的文件,都有一个ContentProvider提供相应的数据。我们需要通过正确的uri去查询相应的ContentProvider即可。

下面就从分析小米手机源码入手,看看是如何使用MediaStore的。

首先,以枚举的形式定义不同文件类型:

public enum FileCategory {

All, Music, Video, Picture, Theme, Doc, Zip, Apk, Custom, Other, Favorite

}

接着,设置各种文件查询的uri:

// query database

String volumeName = "external";

Uri uri = Audio.Media.getContentUri(volumeName); //音频文件

refreshMediaCategory(FileCategory.Music, uri);

uri = Video.Media.getContentUri(volumeName); //视频文件

refreshMediaCategory(FileCategory.Video, uri);

uri = Images.Media.getContentUri(volumeName); //图片文件

refreshMediaCategory(FileCategory.Picture, uri);

uri = Files.getContentUri(volumeName); //其他文件

refreshMediaCategory(FileCategory.Theme, uri);

refreshMediaCategory(FileCategory.Doc, uri);

refreshMediaCategory(FileCategory.Zip, uri);

refreshMediaCategory(FileCategory.Apk, uri);

其中,MediaStore.Files包含了除音频文件、视频文件、图片文件之外的其他文件类型。

之后,我们看refreshMediaCategory方法中做了什么事情:

private boolean refreshMediaCategory(FileCategory fc, Uri uri) {

String[] columns = new String[] {

"COUNT(*)", "SUM(_size)"

};

Cursor c = mContext.getContentResolver().query(uri, columns, buildSelectionByCategory(fc), null, null);

if (c == null) {

Log.e(LOG_TAG, "fail to query uri:" + uri);

return false;

}

if (c.moveToNext()) {

setCategoryInfo(fc, c.getLong(0), c.getLong(1));

Log.v(LOG_TAG, "Retrieved " + fc.name() + " info >>> count:" + c.getLong(0) + " size:" + c.getLong(1));

c.close();

return true;

}

return false;

}

这里面进行了对ContentProvider的查询,根据buildSelectionByCategory方法中设置的条件来查询。

再来看看buildSelectionByCategory方法中的内容:

private String buildSelectionByCategory(FileCategory cat) {

String selection = null;

switch (cat) {

case Theme:

selection = FileColumns.DATA + " LIKE '%.mtz'";

break;

case Doc:

selection = buildDocSelection();

break;

case Zip:

selection = "(" + FileColumns.MIME_TYPE + " == '" + Util.sZipFileMimeType + "')";

break;

case Apk:

selection = FileColumns.DATA + " LIKE '%.apk'";

break;

default:

selection = null;

}

return selection;

}

因为只有MediaStore.Files中的文件内容需要区分,因此按条件查询只需要对这个进行即可。

对于压缩文件(Zip)是:

public static String sZipFileMimeType = "application/zip";

对于文档文件(Doc)是:

private String buildDocSelection() {

StringBuilder selection = new StringBuilder();

Iterator iter = Util.sDocMimeTypesSet.iterator();

while(iter.hasNext()) {

selection.append("(" + FileColumns.MIME_TYPE + "=='" + iter.next() + "') OR ");

}

return selection.substring(0, selection.lastIndexOf(")") + 1);

}

其中,sDocMimeTypesSet是:

public static HashSet sDocMimeTypesSet = new HashSet() {

{

add("text/plain");

add("text/plain");

add("application/pdf");

add("application/msword");

add("application/vnd.ms-excel");

add("application/vnd.ms-excel");

}

};

这样,我们就清楚了小米文件管理器是如何通过MediaStore的功能来实现很快找出各种类型的文件的了。

android+小米文件管理器源码,[MediaStore]小米文件管理器android版源码分析——数据来源...相关推荐

  1. java实现简单扫码登录功能(模仿微信网页版扫码)

    java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端 ...

  2. asp源码-魔方微店商城系统 v1版本源码

    介绍: 魔方微店商城系统是一套基于H5的移动商城系统,适用于手机浏览器.微信公众号.小程序.APP等. 主要功能: 首页.商品列表.商品详情.商品分类.购物车.商品收藏. 商品评价.分享商品.订单管理 ...

  3. galler3d的源码分析——数据来源

    我们这里主要讲本地sd卡的数据,pisaca看情况后续再作分析. 数据操作设计的类包括:CacheService,MediaFeed,LocalDataSource,DiskCache,MediaIt ...

  4. 运势运程算命程序源码 星座运势公众号版源码+授权Token

    内容目录 一.详细介绍 二.效果展示 1.部分代码 2.效果图展示 三.学习资料下载 一.详细介绍 1.首页Banner 轮播图 2.九宫格功能(星座卡片.星座档案.单向历.姓名解析) 3.星座运势 ...

  5. 森林冰火人html源码,森林冰火人单人版(源码)

    [实例简介]java小游戏--森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败. [实例截图] [核心代码] 森林冰火人单人版 ├── bin │   ├ ...

  6. 月老办事处源码/脱单盲盒源码/交友盲盒源码/恋爱盲盒公众号版源码

  7. java实现扫码微信登录_java实现简单扫码登录功能(模仿微信网页版扫码)

    public class PoolCache { // 缓存超时时间 10分钟 private static Long timeOutSecond = 10 * 60 * 1000L; // 每半小时 ...

  8. 编译android源码(小米 mix3内核)

    编译android源码(小米 mix3内核) 一.运行环境搭建 1.Ubuntu选择 在此文章中选择的是ubuntu14.04 2.Linux选择 在此文章中选择的是ubuntu14.04自带的lin ...

  9. 0.6闪光灯二进制编码通信android源码手电筒手机密码器频率控制 as4.0版 密码123456 支持所有android2.2到10及以上系统 Android7.0以前和7.0以后开启闪光灯

    演示:0.6闪光灯二进制编码通信android源码手电筒手机密码器频率控制 as4.0版 密码123456.apk http://6.wjsou.com/uploads/1594994912599.a ...

最新文章

  1. swap的实现(没有中间变量)
  2. cocos 2dx 一 核心类关系
  3. 利用Diferencia和Java微服务进行分接比较测试
  4. java.lang.Exception: Socket bind failed: [730048]
  5. RPi 2B python opencv camera demo example
  6. 动态规划之图像压缩问题
  7. Android5.1 在init.rc 中添加自己的服务【转】
  8. Matlab toolbox Manopt流形优化工具包介绍
  9. World Wind入门
  10. flink 容错机制(检查点的保存、恢复、检查点算法、保存点、状态一致性的三种级别、end-to-end exactly-once)
  11. openpyxl 向excel插入超链接
  12. 放弃有道词典和有道云笔记
  13. panic 和 recover
  14. 重装系统——最纯净的windows10系统安装方法
  15. ACO 蚁群算法(算法流程,TSP例子解析)
  16. 数字藏品到底有什么魔力?目前有哪些靠谱的团队在开发
  17. GPS接收机学习小记(一)
  18. Linux命令之输出文件尾部内容tail
  19. 怎么解决localhost打不开
  20. deepin入坑前必读(懊悔篇)

热门文章

  1. matlab合成和弦,基于Matlab实现音乐识别与自动配置和声的功能.pdf
  2. 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁
  3. Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the
  4. #1752. 聂小倩
  5. QQ空间最新免费个人形象设置方法
  6. 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
  7. 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
  8. 单目标跟踪 (一)相关滤波器 方法综述
  9. windows10电脑在哪配置DNS
  10. macOS:删除DNS