androidlocal-storageandroid-mediascanner

Rescan older files with mediascannerconnection in local storage. files get not updated on windows


My android-application writes a bunch of csv-files and jpg-files to the internal storage of the device. I am using MediaScannerConnection.scanFile() to make the files accessable from my windows-system without rebooting the android-device.

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);
            }
        });
    }
}

In my Logcat i can see every file is getting scanned. The new ones and the old ones.

My problem is when my app is adding new lines to an existing csv-file and the file is getting scanned, The new lines do not appear in the csv-file when its opend from my pc. How can i fix this problem?


I already tried to rename all the files from filename to tmp_filename, rescann all the files and rename them back from tmp_filename to filename and rescann them again. After this, i have can see the oldfilename-file and the tmp_oldfilename-file on my windows-computer. The tmp_oldfilename-file can not be opend (Unknown error on [memory-adress]). The oldfilename-file shows the not updated csv-file.


I also tried to use a intent to scan the files, since some questions on so say its going to update them:

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...");
}

here i can see the files getting scanned too, but they do not show up updated on my windows-computer.


Solution

  • Okay the only solution i came up with, is to set the usb-mode to load-only (this must be done by hand from the user) before performing the MediaScannerConnection.scanFile();. After this is done, the user can set the usb-mode back to mtp and than the csv-files will show up with the new added lines.

    This is a really bad workarround, but still better than rebooting the device. If someone has an better solution, pls share.