android+小米文件管理器源码,[MediaStore]小米文件管理器android版源码分析——数据来源...
打开小米的文件管理器,我们很快会看到如下图所示的界面:
其中,会把各种文件分类显示。并且显示出每种文件的个数。
这是怎么做到的呢?当然不是每次启动都查询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版源码分析——数据来源...相关推荐
- java实现简单扫码登录功能(模仿微信网页版扫码)
java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端 ...
- asp源码-魔方微店商城系统 v1版本源码
介绍: 魔方微店商城系统是一套基于H5的移动商城系统,适用于手机浏览器.微信公众号.小程序.APP等. 主要功能: 首页.商品列表.商品详情.商品分类.购物车.商品收藏. 商品评价.分享商品.订单管理 ...
- galler3d的源码分析——数据来源
我们这里主要讲本地sd卡的数据,pisaca看情况后续再作分析. 数据操作设计的类包括:CacheService,MediaFeed,LocalDataSource,DiskCache,MediaIt ...
- 运势运程算命程序源码 星座运势公众号版源码+授权Token
内容目录 一.详细介绍 二.效果展示 1.部分代码 2.效果图展示 三.学习资料下载 一.详细介绍 1.首页Banner 轮播图 2.九宫格功能(星座卡片.星座档案.单向历.姓名解析) 3.星座运势 ...
- 森林冰火人html源码,森林冰火人单人版(源码)
[实例简介]java小游戏--森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败. [实例截图] [核心代码] 森林冰火人单人版 ├── bin │ ├ ...
- 月老办事处源码/脱单盲盒源码/交友盲盒源码/恋爱盲盒公众号版源码
- java实现扫码微信登录_java实现简单扫码登录功能(模仿微信网页版扫码)
public class PoolCache { // 缓存超时时间 10分钟 private static Long timeOutSecond = 10 * 60 * 1000L; // 每半小时 ...
- 编译android源码(小米 mix3内核)
编译android源码(小米 mix3内核) 一.运行环境搭建 1.Ubuntu选择 在此文章中选择的是ubuntu14.04 2.Linux选择 在此文章中选择的是ubuntu14.04自带的lin ...
- 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 ...
最新文章
- swap的实现(没有中间变量)
- cocos 2dx 一 核心类关系
- 利用Diferencia和Java微服务进行分接比较测试
- java.lang.Exception: Socket bind failed: [730048]
- RPi 2B python opencv camera demo example
- 动态规划之图像压缩问题
- Android5.1 在init.rc 中添加自己的服务【转】
- Matlab toolbox Manopt流形优化工具包介绍
- World Wind入门
- flink 容错机制(检查点的保存、恢复、检查点算法、保存点、状态一致性的三种级别、end-to-end exactly-once)
- openpyxl 向excel插入超链接
- 放弃有道词典和有道云笔记
- panic 和 recover
- 重装系统——最纯净的windows10系统安装方法
- ACO 蚁群算法(算法流程,TSP例子解析)
- 数字藏品到底有什么魔力?目前有哪些靠谱的团队在开发
- GPS接收机学习小记(一)
- Linux命令之输出文件尾部内容tail
- 怎么解决localhost打不开
- deepin入坑前必读(懊悔篇)
热门文章
- matlab合成和弦,基于Matlab实现音乐识别与自动配置和声的功能.pdf
- 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁
- Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the
- #1752. 聂小倩
- QQ空间最新免费个人形象设置方法
- 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
- 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
- 单目标跟踪 (一)相关滤波器 方法综述
- windows10电脑在哪配置DNS
- macOS:删除DNS