Framework Storage Access Framework does not update MediaScanner (MTP)

Using the SAF provided in KitKat, MediaScanner is not invoked on files stored in internal or external storage points of the device. Therefore, I have to determine based on the returned URI if I try to start MediaScanner.

// The SAF uses content URI to pass meta about the file. The following host is used for internal storage.
if (mExportServiceUri.getHost().equals("com.android.externalstorage.documents")) {
    final File externalStorage = Environment.getExternalStorageDirectory();
    final String path = mExportServiceUri.getEncodedPath().replace("/document/primary%3A", "");
    MediaScannerConnection.scanFile(mService.getApplicationContext(), new String[] { new File(
            externalStorage, path).getAbsolutePath() }, null, null);
}

Has anyone else had to get around this problem, and if so, is there a better approach than this? Currently, this only supports external storage of the device and additional storage space, such as SDCard, needs to be handled separately.

+3
source share
1 answer

, , , , USB- , OTG , , usb ( , 4.4 ?) , , , Galaxy S4 (Play Store edition) N5.

// The SAF uses content URI to pass meta about the file. The following host is used for SD storage.
if (mExportServiceUri.getHost().equals("com.android.externalstorage.documents")) {
    final String encodedPath = mExportServiceUri.getEncodedPath();
    final String path = encodedPath.substring(encodedPath.indexOf("%3A") + 3);
    final File[] storagePoints = new File("/storage").listFiles();

    // document/primary is in /storage/emulated/legacy and thus will fail the exists check in the else handling loop check
    if (encodedPath.startsWith("/document/primary")) {
        // External file stored in Environment path
        final File externalFile = new File(Environment.getExternalStorageDirectory(), path);
        MediaScannerConnection.scanFile(mService.getApplicationContext(),
                new String[] { externalFile.getAbsolutePath() }, null, null);
    } else {
        // External file stored in one of the mount points, check each mount point for the file
        for (int i = 0, j = storagePoints.length; i < j; ++i) {
            final File externalFile = new File(storagePoints[i], path);
            if (externalFile.exists()) {
                MediaScannerConnection.scanFile(mService.getApplicationContext(),
                        new String[] { externalFile.getAbsolutePath() }, null, null);
                break;
            }
        }
    }
}
0

All Articles