需求
越來(lái)越多的設(shè)備使用MTP的方式連接PC,傳輸數(shù)據(jù)架馋。項(xiàng)目中需要在連接PC的狀態(tài)下,做新建文件的操作全闷,需要及時(shí)更新PC端的顯示叉寂。
方案及代碼
【環(huán)境】4.4以上;win7
【失敗方案】最開(kāi)始以為是沒(méi)有及時(shí)更新媒體庫(kù)的原因总珠,使用發(fā)送廣播重新掃描:
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory().getPath())));
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file:///mnt/external_sd")));
PS:有可能是因?yàn)榭瘴募A默認(rèn)不刷新屏鳍。(未驗(yàn)證)
【成功方案】相信很多人都找到了MediaScannerConnection.scanFile()方法。這個(gè)方法確實(shí)可行局服,但用法有些特殊钓瞭。
MediaScannerConnection.scanFile()不刷新新的空文件夾!(坑了我半天)淫奔。從官方的方法注釋也看不出支持還是不支持文件夾的掃描山涡,所以我一度認(rèn)為它只支持文件掃描。不扯了唆迁,上代碼
private void updateMTP(String path, String name) {
String filePath = path + File.separator + name + File.separator + ".tempFile.txt";
File tempFile = new File(filePath);
boolean createTempFileState = false;
try {
createTempFileState = tempFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//如果創(chuàng)建失敗鸭丛,直接放棄掃描
if (createTempFileState) {
//在設(shè)備連接電腦時(shí),4.4以上不能用Intent.ACTION_MEDIA_MOUNTED掃描SD卡的廣播
//可使用MediaScannerConnection.scanFile()方法唐责,但是這個(gè)方法在創(chuàng)建空文件夾時(shí)要特殊處理
// 1.創(chuàng)建文件夾
// 2.在文件夾下創(chuàng)建一個(gè)臨時(shí)文件
// 3.掃描并等到掃描結(jié)束刪除臨時(shí)文件
MediaScannerConnection.scanFile(
mContext,
new String[]{filePath},
null,
new MediaScannerConnection.MediaScannerConnectionClient() {
@Override
public void onMediaScannerConnected() {}
@Override
public void onScanCompleted(String path, Uri uri) {
File fileForDelete = new File(path);
if (fileForDelete.exists() && fileForDelete.delete()) {
//文件存在且刪除成功的情況下鳞溉,刪除對(duì)應(yīng)的媒體庫(kù)數(shù)據(jù)
mContext.getContentResolver().delete(uri, null, null);
}
}
}
);
}
}
參考
解決 android 在sd卡新建文件后需要重啟才能找到的評(píng)論
Android通過(guò)廣播更新文件和文件夾到媒體庫(kù)
Android4.4中拒絕發(fā)送Intent.ACTION_MEDIA_MOUNTED掃描SD卡的廣播 - Geder