我們這個檔案掃瞄是基於 這個開源框架的(這個框架還不錯,可以對檔案進行歸類),這裡只是進行了優化。
context.getcontentresolver().query(uri,
projection,
selection,
selectionargs,
mediastore.files
.filecolumns
.date_added + " desc");
引數
描述舉例
uri內容提供者中檔案的路徑
比如:音訊(mediastore.audio.media.external_content_uri)
projection
需要查詢出來的列
檔案的_id 檔案的大小等
selection
查詢的條件
指定乙個查詢的條件,比如 selection = 「mime_type = ?」;
selectionargs
查詢的條件的值
比如:selectionargs = new string;
sortorder
排序比如:mediastore.files.filecolumns.date_added + 」 desc」
下面貼實現**(導包移除):
/**
* todo 掃瞄檔案
*/public class
docscannertask
extends
asynctask
> ;
final string projection = doc_projection;
private
final fileresultcallbackresultcallback;
arraylistallfiles = new arraylist<>();
//todo 指定掃瞄的檔案型別
string selectionargs = new string;
private
final context context;
listlist = new arraylist<>();
public docscannertask(context context, fileresultcallbackfileresultcallback)
/*** todo 子執行緒請求資料
** @param voids
* @return
*/@override
protected listdoinbackground(void... voids)
};runnables.add(runnable);
}final executorservice executorservice = executors.newfixedthreadpool(3);
for (runnable runnable : runnables)
executorservice.shutdown();
//等待執行緒池中的所有執行緒執行完成
while (true)
}return documents;
}private arraylistgetallfiles(int i) else
if (i == 1) else
uri = mediastore.video.media.external_content_uri;
selection = "mime_type = ?";
selectionargs = new string;
} else
if (i == 3) ;
}arraylistdocuments = new arraylist<>();
final cursor cursor = context.getcontentresolver().query(uri,
projection,
selection,
selectionargs,
mediastore.files.filecolumns.date_added + " desc");
if (cursor != null)
return documents;
}@override
protected void onpostexecute(listdocuments)
}/**
* todo 從cursor中獲取資料
** @param data
* @return
*/private arraylistgetdocumentfromcursor(cursor data)
document.setsize(data.getstring(data.getcolumnindexorthrow(mediastore.files.filecolumns.size)));
if (!documents.contains(document))
documents.add(document);}}
return documents;
}/**
* todo 判斷檔案路徑是否是types結尾
** @param types 掃瞄的檔案型別
* @param path 檔案路徑
* @return
*/boolean contains(string types, string path)
}return
false;
}}
**實現說明:我一開始實現是完全用乙個selection 和 selectionargs 進行查詢,發現速度很快,只需要大概1s就能完全載入完(從進入到顯示)。查詢的兩個字段如下:
selection = "mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ?";
selectionargs = new
額,很長,哈哈,後面再測試的過程中發現乙個問題,那就是有一些檔案(.docx .xls .xlsx .rar)按照mime_type 來查詢的話無法載入出來。這就尷尬了,抓耳撓腮,搞了一下午,硬是沒找著,並且馬上要提測了,乾脆騙測試,手機了沒有這個檔案?哈哈,顯然不行,工作要緊。然後在查詢資料的過程中發現了以為大牛的方法不錯,可以解決我的這個難題他的方案是在條件那個字段那裡寫乙個資料庫查詢的語句
selection = "(" + mediastore.files經過測試,完美解決,但是時間上又稍微慢了個1-2s,不過相對於之前的10s,已經快很多了。.filecolumns
.data + " like '%.xls'" +
" or " + mediastore.files
.filecolumns
.data + " like '%.docx'" +
" or " + mediastore.files
.filecolumns
.data + " like '%.xlsx'" +
" or " + mediastore.files
.filecolumns
.data + " like '%.rar'" + ")"
; selectionargs = null;
先寫優點:
1、明顯提高了查詢的速度
2、個人認為該實現方案應該是比較好的(嘿嘿~)
缺點:
1、有侷限性,需要知道所查詢的檔案的型別,然後再找到對應的mime_type
2、有些檔案查詢不出來,得利用其他方法,比如查詢.xls等檔案,如果加入該方法,查詢速度明顯降低,經過測試,如果這個方法裡面的型別增多,那麼該方案將沒有啥有事,開啟依然很慢。
我這個實現的方法只為了實現而實現,靈活性可能降低了一些,若各位大神有什麼好的建議,歡迎指正,交流
之前我用的手機是小公尺手機,其他機型沒有進行適配,後來經過測試發現,部分廠商的手機(華為、oppo)會出現apk檔案掃瞄不到的情景,**已在上面進行修改
各位看官大佬,我想問乙個問題,為什麼有些廠商的手機的有些檔案(.xls、.rar etc.)無法根據mime_type進行掃瞄呢?contentprovider裡面檔案儲存的mime_type不是唯一的嗎?不是與檔案型別一一對應的嗎?
android 關於手機檔案
通過context.getexternalfilesdir 方法可以獲取到 sdcard android data 你的應用的包名 files 目錄,一般放一些長時間儲存的資料。通過context.getexternalcachedir 方法可以獲取到 sdcard android data 你的應...
Android掃瞄指定檔案和目錄
1 啟動mediascanner服務,掃瞄 檔案 程式通過傳送下面的intent啟動mediascanner服務掃瞄指定的檔案或目錄 intent.action media scanner scan file 掃瞄指定檔案 public void scanfileasync context ctx,...
linux 執行緒 快速掃瞄
好久沒有用過多執行緒了,今天 看code有碰到 不少的多執行緒的東西,有必要快速掃一邊,include 1 pthread t 執行緒的id,不同與程序id的是,程序id pid t是乙個非負的整數。而pthread t在標準裡並沒有規定它的實現,可以用結構體來實現 不同的系統可能有不同的實現 2 ...