2014-02-06 2 views
3

Используя SAF, предоставленный в KitKat, MediaScanner не вызывается в файлах, сохраненных во внутренних или внешних точках хранения устройства. Поэтому я должен определить на основе возвращаемого URI, если я попытаюсь запустить MediaScanner.Storage Access Framework не обновляет MediaScanner (MTP)

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

Нужно ли кому-либо еще обойти эту проблему, и если да, то есть ли лучший подход, чем это? В настоящее время это поддерживает только внешнее хранилище устройства и дополнительное пространство для хранения, такое как SDCard, необходимо обрабатывать в отдельной проверке.

+0

Я считаю, что это решает мои проблемы, хотя я обеспокоен тем, что он может не работать на всех устройствах, идущих вперед или даже в настоящее время. Я по-прежнему открыт для предложений по улучшению обработки MediaScanner. –

ответ

0

Чтобы поддерживать то, что, как я считаю, всевозможные крепления, включая USB-накопители, подключенные через OTG или даже, возможно, напрямую к порту USB с полным размером на некоторых планшетах (у меня нет таблетки для тестирования, что с, есть с полноразмерным портом?) У меня есть следующее, которое, похоже, хорошо работает на 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

Я пытаюсь использовать SAF для добавления массовой поддержки USB-накопителей для Nexus 5 и других телефонов, которые в противном случае не могут подключить USB. Но мне трудно понять, как SAF подходит и как этот фрагмент кода вписывается в SAF. Похоже, мы должны расширять DocumentProvider, а затем добавлять точку монтирования в queryRoots(). Но если мы сможем найти корень с указанным выше методом, какое значение добавит SAF, если моя цель - просто открыть файл в моем приложении и не сделать его доступным для других приложений? –

+0

SAF предназначен для работы со всемирно читаемыми файлами на телефоне без необходимости знать их местоположение, а также для работы с файлами, которые в противном случае вы не сможете получить доступ, как в других приложениях, так и в облачном хранилище. Если вы хотите работать с файлами, встроенными в приложение, которые вы не хотите использовать другими приложениями, SAF - это не то, что вы ищете. Рекомендуется использовать внутренний браузер, так как вы можете отображать свои внутренние файлы таким образом, чтобы иметь больше смысла для вашего приложения, чем может сделать общий браузер файлов. –

Смежные вопросы