問題描述
private void testGenerateFile(){
try {
// 輸出路徑為/storage/emulated/0/Out/test.xml
File file= FileUtil.getFileFromCommon("Out","test.xml");
XMLUtil.saveData(file);
showToast("導出檔案成功!");
} catch (Exception e) {
e.printStackTrace();
showToast("SD卡不可用");
}
}
該方法是生成一個xml檔案,檔案路徑在/storage/emulated/0/Out/test.xml,執行後提示“導出檔案成功!”,但是該test.xml檔案在手機檔案浏覽器上顯示正常,能立即發現,但是在windows系統上卻始終找不到該檔案。
原因
The media scanner service will read metadata from the file and add the file to the media content provider.
系統特性。Android系統專門有一個Media Scanner Service,負責讀取檔案的中繼資料(metadata,比如包含檔案類型,檔案路徑等),将檔案的中繼資料添加到Media Content Provider裡。而上述方法建立一個檔案後,并沒有請求Media Scanner Service掃描建立的檔案,也就沒有将test.xml的中繼資料添加到Media Content Provider裡,而window檔案浏覽器可能需要讀取Media Content Provider裡的資料,是以看不到建立的test.xml
解決
請求Media Scanner Service 掃描指定的檔案。
方式一 通過調用MediaScannerConnection.scanFile()
image.png
執行後,windows檔案浏覽器就可以看到了
原理
MediaScannerConnection.scanFile()方法會建立一個MediaScannerConnection,該連接配接會連接配接到系統的Media Scanner Service,一但建立連接配接,就會請求服務掃描指定的檔案或檔案夾。該方法是異步的,可傳入一個OnScanCompletedListener,監聽掃描回調,注意回調不是在主線程執行。
方式二 通過發系統廣播
當發出這個廣播,系統的MediaScannerReceiver會收到,觸發Media Scanner Service掃描廣播裡攜帶的檔案路徑。這也是一個異步過程。