使用本地存储中的 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-filetmp_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 将显示新添加的行。

这是一个非常糟糕的解决方法,但仍然比重新启动设备要好。如果有人有更好的解决方案,请分享。