问题描述
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()
执行后,windows文件浏览器就可以看到了
原理
MediaScannerConnection.scanFile()方法会创建一个MediaScannerConnection,该连接会连接到系统的Media Scanner Service,一但建立连接,就会请求服务扫描指定的文件或文件夹。该方法是异步的,可传入一个OnScanCompletedListener,监听扫描回调,注意回调不是在主线程执行。
方式二 通过发系统广播
当发出这个广播,系统的MediaScannerReceiver会收到,触发Media Scanner Service扫描广播里携带的文件路径。这也是一个异步过程。