Mediaserver veranlassen, eine über ADB erstellte Datei sofort zu scannen

Der Mediaserver in meinem Bestand und gerootetem Android 6.0.1 (läuft in Nexus 6) erkennt keine neuen Dateien, die mit adb erstellt oder in /sdcard verschoben wurden. Es wird nicht erkannt, bis ich einen sanften/vollständigen Neustart durchführe, den ich für inakzeptabel halte.

Ich kann mediaserver manuell über die Befehlszeile ausführen, um erneut mit dem Scannen von Dateien zu beginnen # und ich möchte, dass dies automatisch und sofort erfolgt, wenn eine neue Datei unter /sdcard erstellt wird . Im Moment lasse ich Tasker den Medienserver ausführen, wenn das USB-Kabel abgezogen wird. *

Die offensichtliche Wahl hier scheint eine Automatisierungs-App zu sein, von der ich Tasker und Automate ausprobiert habe , und beide konnten erstaunlicherweise keine neuen Dateien erkennen, insbesondere unter /sdcard/Music, wenn sie über adb erstellt wurden. Wenn jedoch eine App Dateien in einem beliebigen Verzeichnis unter /sdcard erstellt hat , haben diese beiden Apps die Änderungen sofort erkannt. Ich habe auch versucht, Dateien nach /storage/emulated/0/ statt nach /sdcard/ zu verschieben und entsprechende Änderungen an den Triggern dieser beiden Apps vorgenommen. Dieser Schritt hat mir nicht geholfen.

Es ist anzumerken, dass ich dieses Problem auch bei Standard-Android 5.1.1 und einem CM13-Snapshot-Build beobachtet habe.

Also, wie erreiche ich das Ziel?

Aktualisieren

Ich bin mir der Möglichkeit bewusst, einen Alias ​​in dem auf meinem PC ausgeführten Betriebssystem zu erstellen, der ein Skript ausführt, das eine Möglichkeit bietet, die Datei zu verschieben und den Medienserver auszuführen. Allerdings ist es etwas, das ich so weit wie möglich vermeiden möchte.

* Ich benutzte es, wechselte aber später zu einem Skript, das vom PC unter Verwendung eines Alias ​​ausgeführt wurde. Ich möchte mich jedoch nicht auf eine der beiden Methoden verlassen . Meine Finger fühlen sich wohl beim Tippen von adb push anstelle von adb_push oder einem anderen, aber einzelnen Wort.

Aktualisierung 2

  • Ich beabsichtige nicht, mich auf ein bestimmtes Verzeichnis wie Download zu beschränken, und auch das Verschieben von Dateien in letzteres funktioniert nicht wirklich.
  • Ich möchte betonen, dass ich nicht danach frage, wie mediaserver ausgeführt wird . Das weiß ich schon. Alles, was ich suche, ist: Immer wenn ich das tue, adb push FILE /sdcard/FILEsollte der Mediaserver automatisch und sofort eingreifen und die Datei scannen. Unabhängig von wahrnehmbaren Leistungsproblemen möchte ich, dass es jedes Mal einsetzt.

Aktualisierung 3

Okay, vielleicht verwende ich einen falschen Begriff . Vielleicht sind Mediaserver und Mediascanner Begriffe für zwei verschiedene Dinge in Android. Im Falle von Verwechslungen bleiben Sie bitte sowohl bei der aktuellen Revision als auch bei der Prämiennotiz bei „Medienscanner“.

Aktualisierung 4

# Mit freundlicher Genehmigung von androidyue für diese hilfreiche Ressource kann jeder der folgenden Befehle in vorformatiertem Text in meinem Gerät verwendet werden, damit der Medienscanner die Datei scannt.

# FILE_PATH bezieht sich auf den Speicherort der gepushten Datei in Android. ZB /sdcard/Music/lolcat.mp3

am Broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.providers.media/.MediaScannerReceiver
am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://FILE_PATH # funktioniert garantiert. Siehe https://goo.gl/lH0CLT für den Beweis.
am Broadcast -a android.intent.action.MEDIA_MOUNTED -d file://FILE_PATH

Aktualisierung 5

Auf Vorschlag von Manubhargav habe ich Sarkies MTPFix ausprobiert, das hier verfügbar ist . Es hat nicht funktioniert, sowohl in Stock Android 6.0.1 als auch in CM13. Ich habe den folgenden Eintrag gesehen, als ich den Dienst für diese App aktiviert habe.

04-07 09:38:14.771  3383  3383 I MTPService: Watching /storage/emulated/0

Ich habe später eine Sounddatei in /storage/emulated/0/ geschoben und nichts wurde in meinem Musikplayer angezeigt. Logcat hat auch nichts brauchbares angezeigt.

Übrigens verwendet diese App FileObserver , daher bin ich nicht überrascht, wenn sie keine Dateien erkennen konnte, die mit adb erstellt wurden, da es das gleiche Problem mit den von mir ausprobierten Automatisierungs-Apps gibt.


Hinweis: Bitte posten Sie eine Antwort erst, wenn Sie es selbst getestet haben. Danke dir!

Ich habe das gefunden, es liegt außerhalb meines Wissensbereichs (die Antworten weisen auf ein MediaScannerConnection-Tool in Entwicklertools zurück), aber es könnte helfen ... stackoverflow.com/questions/15147536/…
Hinweis für die Leser: Bitte schlagen Sie mir nicht vor, adb zu kompilieren. Das werde ich nicht tun, selbst wenn Sie Einzelheiten dafür angeben.
Sarkies MTP-Fix (APK muss auf dem Gerät installiert werden) hilft Mediaserver, die unter MTP kopierten Dateien zu scannen. Es scannt rekursiv das externe Speicherverzeichnis und fügt es dann dem Media Scanner hinzu, sobald eine Datei erstellt wurde. Es könnte auch mit ADB helfen, einen Versuch wert.

Antworten (2)

Okay, die Antwort scheint trivial zu sein. Meine Finger müssen nicht auf den Komfort des Tippens verzichten , aber ich könnte den Medienscanner veranlassen, meine übertragene Datei automatisch und sofortadb push zu scannen . Hier ist mein Skript, das an meine Bedürfnisse angepasst wurde:

( Hinweis : Root-Zugriff ist in Android nicht erforderlich)

#!/bin/bash

Funktion push_file () {
    target="${@: -1}";
    file_path="${@: -2:1}";
    [[ "$prog_bar" == "-p" ]] && adb "$@" || $call_adb push -p "$file_path" "$ziel";
}

Funktion Sendung () {
    file_name="$(basename "$file_path")";
    [[ `echo "${target: -1}"` != "/" ]] && unset file_name;
    [[ `echo "${target:0:1}"` != "/" ]] && target="/${target}";
    $call_adb Shell 'am Broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d '"\"file://$target$file_name\""'' > /dev/null;
}

wenn [[ "$1" == "-s" ]]; dann
    if [[ "$3" == "push" ]]; dann
        prog_bar="$4";
        call_adb="adb -s $2";
        Push-Datei "$@" && Broadcast;
    anders
        adb "$@";
    fi
elif [[ "$1" == "drücken" ]]; dann
        prog_bar="$2";
        call_adb="adb";
        Push-Datei "$@" && Broadcast;
anders
    adb "$@";
fi

Ich richte dann einen Alias ​​namens adb in .bashrc wie folgt ein:

alias adb='bash FILE'  # FILE refers the file path of the said script

Dies war dank des sehr hilfreichen Artikels möglich: Handhabung von Positionsparametern im Bash Hackers Wiki.

Hinweis : Das Skript erfordert mehr oder weniger ein *nix-basiertes Betriebssystem auf dem PC mit installierter Version 4.x von Bash und Unterstützung für .bashrc . Wenn Sie beabsichtigen, das Skript zu verwenden, sollten Sie es an Ihren Arbeitsstil anpassen.

Ich bin mir nicht sicher, wie der Medienscanner genau funktioniert, ich denke, dass der Medienscanner den Download-Ordner im internen Speicher ständig aktualisiert ...

Wenn etwas nicht in einem anderen Ordner angezeigt wird, kopiere ich es in den Download-Ordner und es löst den Medienscanner aus ...

Versuchen Sie, den Download-Ordner im internen Speicher als absoluten Pfad zu verwenden

Nö. Funktioniert nicht. Übrigens, haben Sie diesen Ansatz selbst mit ADB ausprobiert?
adb Shell am Broadcast android.intent.action.MEDIA_MOUNTED .........Von stackoverflow.com/a/19435985/6116090
Ich glaube du missverstehst meine Frage. Ich habe praktisch kein Problem damit, den Mediaserver manuell auszuführen. Meine Frage bezieht sich darauf, Dinge automatisch zu tun, ohne dass ich eingreifen muss. Das heißt, sobald ich das mache, adb push FILE /sdcard/DIR/sollte der Mediaserver eingreifen und die Datei scannen.
Haben Sie versucht, eine Batch-Datei zu erstellen, um das Skript zu automatisieren? Windows ist commandlist.bat und Linux ist commandlist.sh
Ja. Ich verwende derzeit ein einfaches Skript und möchte mich nicht darauf verlassen. Ich habe das sogar in meiner Frage angesprochen. Bitte überprüfen Sie den Inhalt unter Update in meiner Frage.