文件管理器源码分析(一)

Aboutmillet
file management source code analysis

Openthe file manager millet, we will soon see
the interface as shownbelow:

Amongthem, will be a variety of document classification. And show thenumber of each file.

Androidframework
of the MediaStore has provided us with the correspondingfunction. For various types of documents, there is a ContentProviderto provide the appropriate data. We need to go through the correctContentProvider to query the corresponding URI can be.

First,define the different types of files in
the form of an enumeration:

publicenumFileCategory{

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

}

Next,set a variety of file query uri:

//query database

StringvolumeName = "external";

Uriuri = 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);

Amongthem, MediaStore.Files contains the audio
files, video files, imagefiles, and other types of documents.

Afterthat, we see what the refreshMediaCategory
method does:

privatebooleanrefreshMediaCategory(FileCategoryfc,
Uri uri) {

    String[]columns
= new
String[]{

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

    };

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

    if(c
== null) {

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

        returnfalse;

    }

    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();

        returntrue;

    }

    returnfalse;

}

Thisis carried out on the ContentProvider query, according to theconditions set in the buildSelectionByCategory
method to query.

Andlook at the contents of the buildSelectionByCategory method:

privateStringbuildSelectionByCategory(FileCategory
cat) {

    Stringselection
= null;

    switch(cat)
{

        caseTheme:

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

            break;

        caseDoc:

            selection=
buildDocSelection();

            break;

        caseZip:

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

            break;

        caseApk:

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

            break;

        default:

            selection=
null;

    }

    returnselection;

}

Becauseonly
the contents of the file in MediaStore.Files need to bedistinguished, so the condition query only needs to be done on this.

Forcompressed files (Zip) is:

privateStringbuildDocSelection()
{

    StringBuilderselection
= new
StringBuilder();

    Iterator<String>iter
= Util.sDocMimeTypesSet.iterator();

    while(iter.hasNext()){

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

    }

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

}

Amongthem,
sDocMimeTypesSet is:

publicstatic HashSet<String> sDocMimeTypesSet = new HashSet<String>(){

    {

        add("text/plain");

        add("text/plain");

        add("application/pdf");

        add("application/msword");

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

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

    }

};

Inthis
way, we will know how to use the MediaStore file manager toachieve a variety of types of files through the function to achievevery quickly

时间: 2024-10-29 08:45:05

文件管理器源码分析(一)的相关文章

文件管理器源码分析(五)

/** * 这个文件夹里面存储的内容是app2sd产生的文件夹,也就是是你手机上所有安装到SD卡的应用程序的缓存文件夹. * androidsecure文件夹可以删除吗? *如果删除之后,软件不能正常使用,和系统没有关系. *删的话除了会可能导致移动至sd卡的程序损坏,数据丢失,并不会造成什么严重后果. * 只要把移动到sd卡的损坏程序卸载,重装,手机就完全没有损伤,文件夹也会在再次app2sd时自动重建的. */ public class Util { private static Strin

文件管理器源码分析(三)

//存储favorite数据,到数据库 //SQLiteOpenHelper是一个帮助管理数据库和版本的工具类. //通过继承并重载方法,快速实现了我们自己的Favorite表的CRUD. //怎么感觉和FileOperationHelper类似,仍然是CRUD,只不过1个是数据库中的,1个是文件的. public class FavoriteDatabaseHelper extends SQLiteOpenHelper { //下面6个字段是数据库的名字和版本号.表的名字和3个字段 priva

文件管理器源码分析(二)

/** * 文件操作工具类,执行文件的创建.移动.粘贴.重命名.删除等 * 任务的异步执行和IOperationProgressListener. 拷贝和删除等操作,是比较费时的,采用了异步执行的方式~ http://blog.csdn.net/xufenghappy6/article/details/7343899 异步执行+事件通知 是一种比较流行的模式,比同步等待很多时候要好. */ public class FileOperationHelper { private static fin

linux调度器源码分析 - 运行(四)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运行的情况下进行进程调度的. 系统定时器 因为我们主要讲解的是调度器,而会涉及到一些系统定时器的知识,这里我们简单讲解一下内核中定时器是如何组织,又是如何通过通过定时器实现了调度器的间隔调度.首先我们先看一下内核定时器的框架 在内核中,会使用strut clock_event_device结构描述硬件

linux调度器源码分析 - 初始化(二)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明调度器在系统启动初始化阶段是如何初始化和工作的.通过上期文章我们知道,在多核CPU和SMP系统中,每个CPU(多核COU中的每个核)都有自己的struct rq队列,而rq队列中又有着自己的struct cfs_rq和struct rt_rq.在初始化时就是对这三个结构进行初始化. init_tas

OkHttp3 拦截器源码分析

OkHttp 内置拦截器 在这篇博客 OkHttp3 拦截器(Interceptor) ,我们已经介绍了拦截器的作用,拦截器是 OkHttp 提供的对 Http 请求和响应进行统一处理的强大机制,它可以实现网络监听.请求以及响应重写.请求失败充实等功能. 同时也了解了拦截器可以被链接起来使用,我们可以注册自定义的拦截器(应用拦截器和网络拦截器)到拦截器链上,如下图: 实际上除了我们自定义的拦截器外,OkHttp 系统内部还提供了几种其他的拦截器,就是上图中 OkHttp core 的部分.OkH

[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

jQuery源码分析系列(36) : Ajax - 类型转化器

什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的响应只有 responseText与responseXML 二种 所以现在我要定义dataType为jsonp,那么所得的最终数据是一个json的键值对,所以jQuery内部就会默认帮你完成这个转化工作 jQuery为了处理这种执行后数据的转化,就引入了类型转化器,如果没有指定类型就依据响应头Con