Lösen Sie MediaScanner manuell aus, um Dateien im internen Speicher auf Nougat/Oreo zu scannen

Ich verwalte meine Dateien in Termux oft mit Skripten, die den mvBefehl verwenden, um sie zu verschieben oder umzubenennen. /storage/emulated/0Ich möchte MediaProvider manuell auslösen, um meinen internen Speicher ( ) oder ein bestimmtes Verzeichnis darin mit der Befehlszeile auf einem Telefon zu scannen , auf dem Nougat oder Oreo ausgeführt wird.

Wenn ich eine GUI-Dateimanager-Anwendung verwende, werden alle Verschiebungen/Umbenennungen sofort in anderen MediaScanner-abhängigen Apps wie Gallery widergespiegelt, aber Änderungen, die in einem Terminal vorgenommen werden, nicht bis zu einem Neustart. Also muss ich MediaScanner manuell aufrufen, um meine Änderungen im Dateisystem zu aktualisieren.

Vor KitKat funktionierte dies gut auf /storage/sdcard0(einer separaten Partition namens glow):

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

Der obige Befehl funktioniert jetzt /storage/emulated/0offensichtlich nicht ( ).

Das habe ich auch probiert, scheint aber auch nicht zu funktionieren.

am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard

Ich habe die Befehle gerade noch einmal getestet, sie scheinen auf Wechseldatenträgern wie /storage/sdcard1, /storage/usbaoder /storage/{volume id}(es wird erneut gescannt) zu funktionieren, aber nicht auf dem internen Speicher meines Telefons (wohin /sdcardzeigt, oder /storage/emulated/0).

Hat jemand ein paar Erkenntnisse? Das Neustarten meines Telefons führt immer zu einem erneuten Scan, aber das ist in einigen Fällen unpraktisch.

Hinweis: Die Befehle werden als Root ausgeführt, also keine Bedenken hinsichtlich der Berechtigungen.

Eine Sendung auslösen, dass die SD-Karte gemountet wurde? Dadurch wird implizit der Medienscanner ausgelöst, da er nach möglichen Ergänzungen suchen muss, die Sie auf der Karte vorgenommen haben. Das ist der erste Befehl, den Sie erwähnt haben. Ich frage mich, warum das nicht mehr funktionieren sollte. Hast du es versucht? // Noch eine Idee: Auf einigen Geräten habe ich einen entsprechenden Eintrag in den Entwicklereinstellungen gefunden, mit dem Sie einen erneuten Scan auslösen können. Reinschauen lohnt sich.
@Izzy Keine SD-Karte, sondern interner Speicher. Ich denke, es ist der interne Speicher, der das Problem verursacht (eigentlich nicht gescannt).
Ich weiß nicht, wie das von adb aus geht, aber ich denke, Sie können zu Einstellungen - Apps - Alle Apps gehen, dann auf das 3-Punkt-Menü tippen und System anzeigen auswählen, dann nach unten zu Medienspeicher scrollen und es öffnen, auf Speicher tippen. dann Daten löschen und nach Abschluss des Neustarts. Das funktioniert auf Moto-Geräten mit Nougat und Oreo, es ist vielleicht nicht das, wonach Sie suchen, aber es sollte das gleiche Ergebnis erzielen.
Auch wenn es sich um einen internen Speicher handelt (du meinst wirklich /data, oder eher die interne SD?) – könnte es einen Versuch wert sein, einen Broadcast- Speicher bereitzustellen (nimm dann die interne SD). Sagte nicht Unmount/Mount, nur Broadcasting.
@Izzy Zur Verdeutlichung meinte ich, /sdcardwelche Punkte auf /storage/emulated/0da ich finde, dass es sich zwischen /storage/emulated/0and /storage/sdcard1/ anders verhält /storage/usba.
Dachte schon. Sie haben also die Mount-Übertragung ausgelöst, und nichts ist passiert? Ich wüsste nicht, warum es nicht funktionieren sollte. Die Frage ist nur, wie der Medienscanner darauf reagiert. Bei der externen SD-Karte sollte es trotzdem scannen (wie soll es feststellen, ob Sie den gesamten Inhalt ersetzt haben, bevor es überprüft wurde?) – Sie wissen nur nicht, ob es sich bei der internen SD-Karte anders verhält. Vergessen Sie nicht, es mit dem echten Pfad zu versuchen (gezeigt durch mount). Benötigt jedoch möglicherweise Root-Kräfte, da es "geschützt" werden könnte.
@Izzy Ich habe die Frage mit weiteren Details aktualisiert.
Ich verstehe, danke. Dann gehen mir die Ideen aus. Frage mich, wie mit Änderungen über MTP umgegangen wird – aber ich schätze "pro Datei empfangen/verschoben/gelöscht", also auch kein Trick.

Antworten (1)

Hinweis : Es ist möglich, dass die folgenden Befehle für Sie nicht funktionieren, wenn Sie nur USB-Debugging / Shell (uID 2000) verwenden. In diesem Fall müssen Sie über Root-Zugriff verfügen, damit sie funktionieren .


Vor KitKat hat das gut funktioniert:

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

Der obige Befehl funktioniert jetzt offensichtlich nicht.

Dies funktioniert perfekt auf meinem Standard-Android 7.1.1 (Nexus 6), das nur internen Speicher hat. Aber ab Oreo sind implizite Broadcasts nicht erlaubt , also muss man einen expliziten Broadcast an Media Storage senden . -nDies kann mit dem Argument gefolgt vom Komponentennamen oder einfach von -pgefolgt vom Paketnamen erfolgen . In Android 9.0 (OnePlus 6) hat bei mir Folgendes funktioniert:

am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard/ -p com.android.providers.media

Ich glaube, der obige Befehl würde auch für Android Oreo funktionieren.

Hinweis: Shell (Benutzer 2000) kann diesen Befehl nicht ausführen, daher müssen Sie die Berechtigung auf System (1000) oder Root (0) erhöhen. Kurz gesagt, führen Sie den Befehl als root aus, sonst funktioniert er nicht.


Das habe ich auch probiert, scheint aber auch nicht zu funktionieren.

am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard

Weil diese Absicht eine Datei als Daten erwartet, kein Verzeichnis (ich verstehe, dass alles eine Datei in Linux ist, aber das ist bei einer Absicht nicht der Fall). Geben Sie den vollständigen Pfad einer Datei an und es würde funktionieren. Machen Sie außerdem, wie oben erwähnt, für Oreo und höher die Sendung explizit .

Wenn Sie mehrere Dateien haben und beabsichtigen, nur diese Absicht zu verwenden, müssen Sie alle Dateinamen abrufen und sie rekursiv an die Absicht übergeben (gemäß Aritra Roy auf Stack Overflow). Es kann möglich sein, ein Array zu übergeben, aber ich weiß nicht, wie ich es mit adb machen soll.

Außerdem verhielt sich mein Android bei Dateinamen mit [].

Security exception: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=28279, uid=2000In Android 10 (Huawei Mate 20 Pro) wurde beim Ausführungsversuch ein Fehler angezeigtadb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard/ -p com.android.providers.media
@pvd Entschuldigung für die späte Antwort. Ja, ich sehe, dass ich auch auf OnePlus 6 mit Android 10 denselben Fehler erhalte. Das Ausführen desselben Befehls mit Root-Zugriff funktioniert jedoch einwandfrei. Ich habe meiner Antwort einen Hinweis hinzugefügt, um die Notwendigkeit des Root-Zugriffs zu betonen, falls der Befehl nicht funktioniert. Danke, dass du mich darauf aufmerksam gemacht hast.