我的 android 应用程序将一堆 csv 文件和 jpg 文件写入设备的内部存储器。我正在使用 MediaScannerConnection.scanFile()
使文件可以从我的 windows 系统访问,而无需重新启动 android 设备。
private void scanFiles() {
File targetDirectory = new File(Environment.getExternalStorageDirectory(), "DIR_OF_MY_APP");
if (targetDirectory.exists()) {
List<File> filesToScan = getFiles(targetDirectory);
List<String> filePathsToScan = new ArrayList<>();
for(File file : filesToScan) {
filePathsToScan.add(file.getPath());
}
MediaScannerConnection.scanFile(this, filePathsToScan.toArray(new String[0]), null, new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.d("OK", "Path: " + path);
Log.d("OK", "Uri : " + uri);
}
});
}
}
在我的 Logcat 中,我可以看到每个文件都在被扫描。新的和旧的。
我的问题是当我的应用程序向现有的 csv 文件添加新行并且正在扫描该文件时,当从我的电脑打开 csv 文件时,新行不会出现在 csv 文件中。我该如何解决这个问题?
我已经尝试将所有文件从 filename
重命名为 tmp_filename
,重新扫描所有文件并将它们从 tmp_filename
重命名为 >filename
并再次重新扫描它们。在此之后,我可以在我的 Windows 计算机上看到 oldfilename-file
和 tmp_oldfilename-file
。 tmp_oldfilename-file
无法打开([内存地址] 上出现未知错误)。 oldfilename-file
显示未更新的 csv 文件。
我还尝试使用 intent 来扫描文件,因为一些关于 so 的问题说它会更新它们:
for(File file : filesToScan) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
Log.d("OK", "File: " + file.getName() + " scanned...");
}
在这里我也可以看到正在扫描的文件,但它们没有在我的 Windows 计算机上显示更新。
最佳答案
好的,我想到的唯一解决方案是在执行之前将 usb-mode
设置为 load-only
(这必须由用户手动完成) MediaScannerConnection.scanFile();
。完成后,用户可以将 usb-mode
设置回 mtp
,然后 csv 文件将显示新添加的行。
这是一个非常糟糕的解决方法,但仍然比重新启动设备要好。如果有人有更好的解决方案,请分享。
关于android - 使用本地存储中的 mediascannerconnection 重新扫描旧文件。文件在 Windows 上未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48862775/