简介
日常开发中经常性的会遇到选择各式各样的文件,然而系统提供的文件选择很渣,加上国内厂商的多方魔改...完犊子文件选择器彻底成渣男了.
日常开发中,大多数的图片选择和各式各样文件选择,都是项目中自己写的(起码我的是这样).所以在这里梳理了一下处理的思路以及简单的代码实现.
需求
- 查询所有文件
- 查询指定格式文件
- 多种格式文件混合查询
- 不同文件不同的图片展示
实现思路
1.查询所有文件
查询所有文件我这里没有查询游标查询,因为Android File 类提供了罗列问价夹下文件以及文件俩的方法.所以我们只需要找到根目录然后列出文件夹和文件然后根据自己需求做个排序就可以了
// 根据目录加载文件
private fun loadFile(rootFile: File) {
mCurrentDirectory = rootFile
var listFils = rootFile!!.listFiles(CustomFileTypeFileter())
if (listFils == null || listFils.size == 0) {
showEmpty(true)
return
} else {
showEmpty(false)
}
var datas = listFils.toMutableList()
try {
Collections.sort<File>(datas, FilesListComparator())
mAdapter!!.removeAllItems()
mAdapter!!.addItems(datas)
binding!!.path.text = String.format("%s 个文件", datas.size)
} catch (e: Exception) {
}
}
2. 根据指定类型查询指定类型我的文件
File文件操作类加入要实现获取文件下指定类型的文件需要递归循环,相对于根据游标查询比较麻烦和耗时.所以做这个查询指定格式文件的需求我们就用游标查询实现.
注意
因为Media 类支持的文件类型比较少,所以以Media.TYPE作为查询条件不太好使.所以我们的思路是以文件名结尾为查询条件
/**
* 获取指定格式的文件
* @param context
* @param extension
*/
public static ArrayList<File> getFileByType(Context context, String[] extension) {
ArrayList<File> fileList=new ArrayList<File>();
//从外存中获取
Uri fileUri = MediaStore.Files.getContentUri("external");
//筛选列,这里只筛选了:文件路径和不含后缀的文件名
String[] projection = new String[]{
MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.TITLE
};
//构造筛选语句
String selection = "";
for (int i = 0; i < extension.length; i++) {
if (i != 0) {
selection = selection + " OR ";
}
selection = selection + MediaStore.Files.FileColumns.DATA + " LIKE '%" + extension[i] + "'";
}
//按时间递增顺序对结果进行排序;待会从后往前移动游标就可实现时间递减
String sortOrder = MediaStore.Files.FileColumns.DATE_MODIFIED;
//获取内容解析器对象
ContentResolver resolver = context.getContentResolver();
//获取游标
Cursor cursor = resolver.query(fileUri, projection, selection, null, sortOrder);
if (cursor == null)
return null;
//游标从最后开始往前递减,以此实现时间递减顺序(最近访问的文件,优先显示)
if (cursor.moveToLast()) {
do {
//输出文件的完整路径
String data = cursor.getString(0);
fileList.add(new File(data));
Log.d("tag", data);
} while (cursor.moveToPrevious());
}
cursor.close();
return fileList;
}
3.实现过程中小知识点
- 空文件过滤
- 文件文件夹排序
- 指定不同文件类型展示不同的图标
- 动态配置选择的条件
总结
具体的实现逻辑我放在项目中了,感兴趣的可以下载看看
码字不易,欢迎点赞!!!
网友评论