54 Stimmen

Aktualisieren Sie Android Mediastore mit adb

Ich benutze adb, um Musik auf einem Android-Telefon zu synchronisieren. Im Wesentlichen lösche ich das vorhandene Musikverzeichnis und schiebe Ersatzmusikdateien.

Ich möchte adb verwenden können, um eine Neuscannung zu erzwingen, damit der Google Musikplayer (und andere Apps) ordnungsgemäß mit den neuen Liedern und Playlists funktioniert.

Laut Wie kann ich den MediaStore auf Android aktualisieren? können Sie eine Neuscannung erzwingen, indem Sie ein entsprechendes Intent übertragen.

adb bietet 'shell am broadcast', das es mir ermöglichen würde, eine Neuscannung von adb aus zu erzwingen.

Alternativ könnte ich eine Rescan-App ausführen oder neu starten, aber ich möchte die Neuscannung von adb auslösen.

Welchen adb-Befehl sollte ich ausführen? Die Musikdateien und Playlists befinden sich alle in /sdcard/music.

58voto

user2892047 Punkte 696

Die Rescan-Apps verwenden eine Media-Mount-Absicht, um den Medien-Scanner zu starten. Du kannst am broadcast verwenden, um die gleiche Absicht zu senden.

Der Befehl lautet:

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

35voto

Manas Tungare Punkte 597

Das MEDIA_MOUNTED-Intent ist nicht mehr erlaubt (nach KitKat) für Nicht-System-Apps; versuchen Sie stattdessen dies.

Es ist jedoch nicht rekursiv und muss auf den genauen_Dateinamen ausgeführt werden, also ist es kein guter Ersatz.

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

Wenn Sie eine rekursive Neuscannung benötigen, können Sie diesen Befehl verwenden (Pfade entsprechend anpassen):

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

Oder so (wenn das obige für Sie nicht funktioniert):

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

2voto

Sander Punkte 21

Auf einigen Samsung-Mobilgeräten können Sie eine vollständige Neuscanung wie folgt durchführen:

am broadcast -a com.samsung.intent.action.MTP_FILE_SCAN -n com.android.providers.media/.MediaScannerReceiver

1voto

André Kugland Punkte 655

Wenn Sie Ihr Telefon gerootet haben, können Sie dieses von mir geschriebene Skript verwenden, das den Vorteil hat, den Überblick darüber zu behalten, welche Dateien bereits aktualisiert wurden:

#!/system/bin/env busybox ash

MUSIC_LIBRARY=/sdcard/MusicLibrary

LAST_UPDATE="$(stat -c %Y "$MUSIC_LIBRARY/.last-update")"

find "$MUSIC_LIBRARY" -type f ! -iname ".last-update" | (
  while read f; do
    if ! test "$LAST_UPDATE" -ge "$(stat -c %Y "$f")"; then
      am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d "file://$f"
      touch "$f"
    else
      echo "Nicht aktualisiert: \`$f'"
    fi
  done
)

touch "$MUSIC_LIBRARY/.last-update"

1voto

Waxrat Punkte 481

Hier ist ein Python-Skript namens adb-scan. Es verwendet adb um das Android-Gerät aufzufordern, die angegebenen Dateien neu zu scannen.

Beispielverwendung:

$ adb-scan Benachrichtigungen/\*.mp3
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/Notifications/cough.mp3 flg=0x400000 }
Broadcast abgeschlossen: result=0
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/Notifications/harmonica3.mp3 flg=0x400000 }
Broadcast abgeschlossen: result=0
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/Notifications/shhh.mp3 flg=0x400000 }
Broadcast abgeschlossen: result=0
$

Hier ist das Skript:

#!/usr/bin/python3
#
# Fordere den Android-Mediascanner auf, die angegebenen Dateien zu überprüfen.
#
import sys
import os
import re

sys.argv.pop(0)

if not sys.argv:
   sys.exit('Verwendung: adb-scan Dateien...')

intent = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE'

# Sonderzeichen wie Leerzeichen, Backslashes und Anführungszeichen zitieren. Besonders '*'
# nicht zitieren, da wir möchten, dass dies auf dem Android-Gerät erweitert wird.
def cleanup(arg):
   if not arg.startswith('/'):
      arg = '/sdcard/' + arg
   arg = re.sub("[ \\'\"]", lambda x: '\\' + x.group(0), arg)
   return arg

script = '''
for i in {args}; do
    [ -e "$i" ] || echo "Warnung: Datei nicht gefunden: $i"
    am broadcast -a "{intent}" -d "file://$i"
done
'''.format(args=' '.join(map(cleanup, sys.argv)),
           intent=intent)

cmd = ['adb', 'shell', script]
os.execvp(cmd[0], cmd)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X