Я пробовал множество различных методов для запуска MediaScanner, и это мои результаты.
SendBroadcast
Самое простое и наивное решение.Он состоит в выполнении следующей инструкции из вашего кода:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Однако этот больше не работает на устройствах KitKat из-за отсутствия необходимых разрешений.
MediaScannerWrapper
Как опубликовано здесь (за ответ @ Брайана), он заключается в переносе экземпляра MediaScannerConnection
для запуска метода scan()
по конкретному каталогу.Этот метод хорошо себя зарекомендовал для 4.3 и ниже, но все же не повезло с KitKat (4.4 +).
FileWalker
Один из многихПриложения Play Store, которые пытаются преодолеть отсутствие обязательств MediaStore по обновлению своей базы данных: ReScan SD .Он отправляет множество разных широковещательных сообщений:
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file://" + Environment.getExternalStorageDirectory())));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable/SD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable/MicroSD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///mnt/Removable/MicroSD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///mnt")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///storage")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable")));
и пытается поддерживать KitKat, вручную вызывая метод scan()
для каждого файла базового каталога.К сожалению, это очень сильно загружает процессор и отнимает много времени, поэтому не очень рекомендуется.
"Способ оболочки"
ЕдинственноеПохоже, что в некоторых случаях он работает с KitKat - отправляет трансляцию через adb shell
.Итак, этот фрагмент кода позволяет вам делать это программно:
Runtime.getRuntime().exec("am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://" + Environment.getExternalStorageDirectory());
Это скорее хакерский способ сделать это, но на данный момент это лучшее, что я мог придумать.
Итог
Каждое из вышеперечисленных решений действительно работает для всего, что не является KitKat.Это связано с тем, что благодаря Джастину была обнаружена ошибка, выданная официальному трекеру .Это означает, что до тех пор, пока ошибка не будет устранена, у нас не останется настоящей поддержки KitKat.
Какой использовать?Среди них я бы использовал решение MediaScannerWrapper
вместе с подходом shell-ish
(последним).