需求
越来越多的设备使用MTP的方式连接PC,传输数据。项目中需要在连接PC的状态下,做新建文件的操作,需要及时更新PC端的显示。
方案及代码
【环境】4.4以上;win7
【失败方案】最开始以为是没有及时更新媒体库的原因,使用发送广播重新扫描:
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:有可能是因为空文件夹默认不刷新。(未验证)
【成功方案】相信很多人都找到了MediaScannerConnection.scanFile()方法。这个方法确实可行,但用法有些特殊。
MediaScannerConnection.scanFile()不刷新新的空文件夹!(坑了我半天)。从官方的方法注释也看不出支持还是不支持文件夹的扫描,所以我一度认为它只支持文件扫描。不扯了,上代码
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();
}
//如果创建失败,直接放弃扫描
if (createTempFileState) {
//在设备连接电脑时,4.4以上不能用Intent.ACTION_MEDIA_MOUNTED扫描SD卡的广播
//可使用MediaScannerConnection.scanFile()方法,但是这个方法在创建空文件夹时要特殊处理
// 1.创建文件夹
// 2.在文件夹下创建一个临时文件
// 3.扫描并等到扫描结束删除临时文件
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()) {
//文件存在且删除成功的情况下,删除对应的媒体库数据
mContext.getContentResolver().delete(uri, null, null);
}
}
}
);
}
}
参考
解决 android 在sd卡新建文件后需要重启才能找到的评论
Android通过广播更新文件和文件夹到媒体库
Android4.4中拒绝发送Intent.ACTION_MEDIA_MOUNTED扫描SD卡的广播 - Geder