有时候会碰到一些文件浏览的需求,但是App本身又并非一个文件管理相关的App,可能只是某个功能,需要让用户来选择文件进行后续操作。所以这里只是为了实现一个简单的文件浏览的功能,如果需要实现一整套文件管理的功能,请换方案或者自行添加功能。
文件浏览的常用实现
文件浏览的功能,实现方式有好几种,这里介绍几种常用的方式:
使用MediaStore方式,直接获取到所有的有效文件,再进行文件夹组合。
使用Runtime.getRuntion().exec("cmdline")直接执行命令行命令,然后解析返回结果。
使用File类的方式来访问目录之下所有的文件。
现在来分析分析三种有什么优缺点:
MediaStore
MediaStore会在系统内部维护一张SQLite表,然后通过ContentResolver的方式就可以获取到SQLite表中记录的文件。通过MediaStore可以很方便的写类似SQL语句来进行查询,并且文件的格式、名称、尺寸等,都有特定的字段去标识。
下面给出一个external.db的SQLite表结构:
external.png
从图中可以看到,external.db中包含了一个“files”的Table,内部维护了外部存储器里所有需要被维护的文件。而它还有对特定类型的文件类型进行了视图显示,例如:Images、video。
如果仅仅是需要做到文件浏览,可以直接通过MediaStore分别查询内部存储器和外部存储器的files表即可。
file表的结构如下图:
table_files.png
使用MediaStore使用起来非常的方便,详细的使用方式这里就不介绍了。但是使用MediaStore还是有一些问题的,例如第三方App保存的文件,如果第三方App没有处理的话,可能你需要等到下次重启之后,才能通过MediaStore扫描到,它会在重启、Sdcard装载等时机,重新扫描刷新。当然也有办法自动去刷新,只需要发送一个对应的Broadcast即可,但是也是有坑的,大概是在Android 4.0+之后,只能指定目录进行刷新,所以需要维护大量的目录来做。这里就不展开讨论了,具体的可以自行百度。
CmdLine
使用Runtion.getRuntion.exec()的方式直接执行例如:cd、ls等命令行命令,然后读取输出结果进行解析,就可以拿到对应目录下的文件信息。这种方式使用起来其实也非常的方便,而且效率也是有保障的,但是解析数据上,操作的数据是大量的String,可能在开发的时候,不够直观需要处理各种占位、符换行符等问题上耗时。
至于如何使用R