Ho provato molti metodi diversi per attivare MediaScanner e questi sono i miei risultati.
SendBroadcast
La soluzione più semplice e ingenuo. Consiste nell'eseguire le seguenti istruzioni dal codice:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Tuttavia, questo non funziona più in dispositivi KitKat, a causa della mancanza di autorizzazioni necessarie.
MediaScannerWrapper
Come postato here (per @ risposta di Brian), consiste nello spostamento di un'istanza MediaScannerConnection
al fine di innescare il metodo scan()
su una directory specifica. Questo metodo ha dimostrato di funzionare correttamente per 4.3 e sotto, ma ancora senza fortuna con KitKat (4.4+).
Filewalker
Una delle molte applicazioni Play Store che cerca di superare la mancanza di impegno del MediaStore di aggiornare il suo database è ReScan SD. Si invia un sacco di diverse trasmissioni:
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")));
e cerca di sostenere KitKat innescando manualmente il metodo scan()
su ogni file della directory di base. Sfortunatamente, è molto dispendioso in termini di CPU e richiede molto tempo, quindi non è molto raccomandato.
"Il modo in guscio"
L'unica cosa che sembra funzionare con KitKat in alcuni casi sta inviando la trasmissione via adb shell
. Quindi, questo frammento di codice consente di fare proprio questo a livello di codice:
Runtime.getRuntime().exec("am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://" + Environment.getExternalStorageDirectory());
È più di un modo hack-ish di farlo, ma al momento è il meglio che ho potuto trovare.
Linea di fondo
Ognuna delle soluzioni di cui sopra in realtà lavora per tutto ciò che non è KitKat. Questo perché, grazie a Justin, un bug è stato trovato ed è stato rilasciato allo official Tracker. Questo significa che, fino a quando il bug non sarà risolto, non ci sarà alcun vero supporto per KitKat.
Quale usare? Tra questi, vorrei utilizzare la soluzione MediaScannerWrapper
, insieme all'approccio shell-ish
(l'ultimo).
L'app "sdrescan" fa quello che vuoi. È gratis; forse potresti chiedere all'autore un frammento di codice. O semplicemente lanciarlo dalla tua app. –
Esiste un modo per eseguire nuovamente la scansione senza interrompere il lettore musicale? Dice Spiacente, il lettore multimediale non supporta questo file, fino a quando non premo una traccia, inoltro una traccia, quindi riproduce nuovamente. – NoBugs