2013-07-29 23 views
34

Sto usando adb per sincronizzare la musica su un telefono Android. In sostanza, eseguo la directory musicale esistente e sposto file musicali sostitutivi.Refresh Android mediastore tramite adb

Mi piacerebbe poter usare adb per forzare una nuova scansione, in modo che il lettore musicale di google (e altre app) funzioni correttamente con i nuovi brani e playlist.

In base a How can I refresh MediaStore on Android? è possibile forzare una nuova scansione trasmettendo un'intenzione appropriata.

adb fornisce 'shell am broadcast', che sembra consentirmi di forzare una nuova scansione da adb.

In alternativa ho potuto eseguire un'applicazione nuova analisi o di ripartenza, ma mi piacerebbe far scattare la riacquisizione da adb

Quale comando adb dovrei rilasciare? I file musicali e le playlist sono tutti in/sdcard/musica.

risposta

51

Le app di rescan utilizzano un supporto per supporti multimediali per avviare lo scanner del supporto. È possibile utilizzare am broadcast per inviare lo stesso intento.

Il comando è:

adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard 
+30

Sto usando: 'adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file: /// mnt/sdcard/Music' – foosion

+0

Ho notato che su Kitkat la scansione non avviene immediatamente, solo alla fine Non ricordo se questo fosse il caso delle API precedenti. C'è un modo per forzare la scansione ad accadere immediatamente? – futtetennista

+2

@foosion Funziona sul mio Nexus 6 con Android 5.1.1, 6.0 e 6.0.1. –

10

L'intento MEDIA_MOUNTED non è consentito (posta KitKat) per le applicazioni non di sistema; prova questo invece

Non è ricorsivo, tuttavia, e deve essere eseguito su esatto_file_nome, quindi non è un buon sostituto.

adb shell am broadcast \ 
    -a android.intent.action.MEDIA_SCANNER_SCAN_FILE \ 
    -d file:///mnt/sdcard/Music/<exact_file_name> 

Se è necessario ripetere la scansione in modo ricorsivo, è possibile utilizzare questo comando (i percorsi fix di conseguenza):

adb shell "find /mnt/sdcard/Music/ -exec am broadcast \ 
    -a android.intent.action.MEDIA_SCANNER_SCAN_FILE \ 
    -d file://{} \\;" 

O come questo (se sopra non funziona per voi):

adb shell "find /mnt/sdcard/Music/ | while read f; do \ 
    am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE \ 
    -d \"file://${f}\"; done" 
+1

È 'android.intent.action.MEDIA_SCANNER_SCAN_FILE', non 'android.intent.action.ACTION_MEDIA_SCANNER_SCAN_FILE'. ACTION_ * è il nome della variabile Android: https://developer.android.com/reference/android/content/Intent.html#ACTION_MEDIA_SCANNER_SCAN_FILE – rom1v