使用本地存储中的 mediascannerconnection 重新扫描旧文件。文件未在 windows 更新
Rescan older files with mediascannerconnection in local storage. files get not updated on windows
我的 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 计算机上显示更新。
好的,我想到的唯一解决方案是在执行 MediaScannerConnection.scanFile();
之前将 usb-mode
设置为 load-only
(这必须由用户手动完成)。完成后,用户可以将 usb-mode
设置回 mtp
,然后 csv-files 将显示新添加的行。
这是一个非常糟糕的解决方法,但仍然比重新启动设备要好。如果有人有更好的解决方案,请分享。
我的 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 计算机上显示更新。
好的,我想到的唯一解决方案是在执行 MediaScannerConnection.scanFile();
之前将 usb-mode
设置为 load-only
(这必须由用户手动完成)。完成后,用户可以将 usb-mode
设置回 mtp
,然后 csv-files 将显示新添加的行。
这是一个非常糟糕的解决方法,但仍然比重新启动设备要好。如果有人有更好的解决方案,请分享。