Próbowałem wiele różnych metod, aby uruchomić MediaScanner, i to są moje wyniki.
SendBroadcast
Najprostszym i naiwne rozwiązania. Polega ona na wykonaniu następującą instrukcję z kodu:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Jednak ta nie działa w urządzeniach KitKat, ze względu na brak wymaganych uprawnień.
MediaScannerWrapper
Jak pisał here (za @ Briana odpowiedź), polega ona na owijanie instancji MediaScannerConnection
w celu wywołania metody scan()
w określonym katalogu. Ta metoda okazała się działać dobrze dla wersji 4.3 i poniżej, ale wciąż nie ma szczęścia w KitKat (4,4+).
FileWalker
Jedną z wielu aplikacji w Sklepie Play, która stara się przezwyciężyć brak w Mediastore za zobowiązania zaktualizować jego bazy danych jest ReScan SD. Wysyła wiele różnych programów:
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")));
i stara się wspierać KitKat ręcznie wywołując metodę scan()
nad każdego pliku w katalogu głównym. Niestety, jest to bardzo obciążające procesor i czasochłonne, więc nie jest zalecane.
„Droga shell”
Jedyną rzeczą, która wydaje się działać z KitKat w niektórych przypadkach jest wysyłanie transmisji poprzez adb shell
. Tak, ten fragment pozwala nie tylko, że programowo:
Runtime.getRuntime().exec("am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://" + Environment.getExternalStorageDirectory());
To jest bardziej hack-owski sposób prowadzenia, ale w tej chwili jest najlepsze co mogłem wymyślić.
Konkluzja
Każde z powyższych rozwiązań faktycznie działa na wszystko, co nie jest KitKat. Dzieje się tak, ponieważ dzięki Justin znaleziono błąd i został on wydany official Tracker. Oznacza to, że dopóki błąd nie zostanie usunięty, pozostaniemy bez prawdziwej obsługi KitKat.
Który użyć? Spośród nich korzystałbym z rozwiązania MediaScannerWrapper
wraz z podejściem shell-ish
(ostatnim).
Aplikacja "sdrescan" robi to, co chcesz. Jest wolne; może mógłbyś poprosić autora o fragment kodu? Lub po prostu uruchom go ze swojej aplikacji. –
Czy istnieje sposób na ponowne skanowanie bez zatrzymywania odtwarzacza muzycznego? Mówi "Przepraszam", odtwarzacz multimedialny nie obsługuje tego pliku, dopóki nie przywrócę utworu, nie przeskoczę utworu, a następnie zostanie odtworzony ponownie. – NoBugs