Как запустить MediaScan на Nexus 7?

Поскольку я хочу, чтобы MediaStore имел самую последнюю информацию без необходимости перезагрузки, я хотел бы запустить MediaScanner, используя популярный способ, который я нашел на SO

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

Это отлично работает на Samsung S2 w / ICS, но не на моем Nexus 7 w / JellyBean. Logcat показывает это на моем Nexus 7:

 WARN/ActivityManager(480): Permission denied: checkComponentPermission() owningUid=10014 WARN/BroadcastQueue(480): Permission Denial: broadcasting Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/emulated/0 flg=0x10 } from com.example.foo.bar (pid=17488, uid=10046) is not exported from uid 10014 due to receiver com.android.providers.downloads/.DownloadReceiver INFO/ActivityManager(480): Start proc com.google.android.music:main for broadcast com.google.android.music/.store.MediaStoreImportService$Receiver: pid=17858 uid=10038 gids={50038, 3003, 1015, 1028} INFO/MusicStore(17858): Database version: 50 INFO/MediaStoreImporter(17858): Update: incremental Added music: 0 Updated music: 0 Deleted music: 0 Created playlists: 0 Updated playlists: 0 Deleted playlists: 0 Inserted playlist items: 0 Deleted playlist items: 0 Removed orphaned playlist items: 0 

Последняя строка звучит обнадеживающе в теории, но значения всегда равны 0 даже после того, как новые файлы были перенесены на SD-карту (с помощью adb push). На моем старшем устройстве (S2) он перезагружает SD-карту.

Я добавил следующие разрешения для моего AndroidManifest.xml, но он ведет себя так же, как без этих разрешений:

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

Любые идеи / альтернативы?


Изменить 1:

Обратите внимание, что я не знаю путей к файлам новых или измененных или удаленных файлов. Я просто хочу убедиться, что MediaStore обновлен.

Solutions Collecting From Web of "Как запустить MediaScan на Nexus 7?"

Используя популярный способ, который я нашел на SO

ACTION_MEDIA_MOUNTED передачи ACTION_MEDIA_MOUNTED никогда не были подходящим решением IMHO.

Любые идеи / альтернативы?

Используйте MediaScannerConnection , например, через свой статический метод scanFile() .

Вот пример кода, основанный на ответе CommonsWare:

 MediaScannerConnection.scanFile(activity, new String[]{path}, null, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(final String path, final Uri uri) { Log.i(TAG, String.format("Scanned path %s -> URI = %s", path, uri.toString())); } }); 

Хотя в большинстве случаев, когда вы знаете файлы, которые нужно добавить / обновить / и т. Д. На MediaStore, следует следовать ответам CommonsWare, я хотел бы опубликовать свое решение, где мне нужно сделать это грубо, потому что я не знаю пути к файлам. Я использую это в основном для тестирования / демонстрации:

 Uri uri = Uri.fromFile(Environment.getExternalStorageDirectory()); activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, uri)); 

BTW, никаких разрешений не требуется для любого решения.

Мой ответ немного запоздалый, но он может помочь тем, кто сохранит новый файл, и хотел бы расширить медиа-магазин именно этим файлом на Android Kitkat: на Android Kitkat намерение ACTION_MEDIA_MOUNTED заблокировано для несистемных приложений (I Думаю, потому что сканирование всей файловой системы довольно дорого). Но по-прежнему можно использовать намерение ACTION_MEDIA_SCANNER_SCAN_FILE, чтобы добавить файл в медиа-магазин:

 File f = new File(path to the file you would like to add to the media store ...); try { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(f); mediaScanIntent.setData(uri); sendBroadcast(mediaScanIntent); } catch(Exception e) { ... }