效果.gif
簡(jiǎn)介
日常開(kāi)發(fā)中經(jīng)常性的會(huì)遇到選擇各式各樣的文件,然而系統(tǒng)提供的文件選擇很渣,加上國(guó)內(nèi)廠商的多方魔改...完?duì)僮游募x擇器徹底成渣男了.
日常開(kāi)發(fā)中,大多數(shù)的圖片選擇和各式各樣文件選擇,都是項(xiàng)目中自己寫(xiě)的(起碼我的是這樣).所以在這里梳理了一下處理的思路以及簡(jiǎn)單的代碼實(shí)現(xiàn).
需求
- 查詢(xún)所有文件
- 查詢(xún)指定格式文件
- 多種格式文件混合查詢(xún)
- 不同文件不同的圖片展示
實(shí)現(xiàn)思路
1.查詢(xún)所有文件
查詢(xún)所有文件我這里沒(méi)有查詢(xún)游標(biāo)查詢(xún),因?yàn)锳ndroid File 類(lèi)提供了羅列問(wèn)價(jià)夾下文件以及文件倆的方法.所以我們只需要找到根目錄然后列出文件夾和文件然后根據(jù)自己需求做個(gè)排序就可以了
// 根據(jù)目錄加載文件
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 個(gè)文件", datas.size)
} catch (e: Exception) {
}
}
2. 根據(jù)指定類(lèi)型查詢(xún)指定類(lèi)型我的文件
File文件操作類(lèi)加入要實(shí)現(xiàn)獲取文件下指定類(lèi)型的文件需要遞歸循環(huán),相對(duì)于根據(jù)游標(biāo)查詢(xún)比較麻煩和耗時(shí).所以做這個(gè)查詢(xún)指定格式文件的需求我們就用游標(biāo)查詢(xún)實(shí)現(xiàn).
注意
因?yàn)镸edia 類(lèi)支持的文件類(lèi)型比較少,所以以Media.TYPE作為查詢(xún)條件不太好使.所以我們的思路是以文件名結(jié)尾為查詢(xún)條件
/**
* 獲取指定格式的文件
* @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
};
//構(gòu)造篩選語(yǔ)句
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] + "'";
}
//按時(shí)間遞增順序?qū)Y(jié)果進(jìn)行排序;待會(huì)從后往前移動(dòng)游標(biāo)就可實(shí)現(xiàn)時(shí)間遞減
String sortOrder = MediaStore.Files.FileColumns.DATE_MODIFIED;
//獲取內(nèi)容解析器對(duì)象
ContentResolver resolver = context.getContentResolver();
//獲取游標(biāo)
Cursor cursor = resolver.query(fileUri, projection, selection, null, sortOrder);
if (cursor == null)
return null;
//游標(biāo)從最后開(kāi)始往前遞減蜘腌,以此實(shí)現(xiàn)時(shí)間遞減順序(最近訪(fǎng)問(wèn)的文件远搪,優(yōu)先顯示)
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.實(shí)現(xiàn)過(guò)程中小知識(shí)點(diǎn)
- 空文件過(guò)濾
- 文件文件夾排序
- 指定不同文件類(lèi)型展示不同的圖標(biāo)
- 動(dòng)態(tài)配置選擇的條件
總結(jié)
具體的實(shí)現(xiàn)邏輯我放在項(xiàng)目中了,感興趣的可以下載看看
碼字不易,歡迎點(diǎn)贊!!!