Hacer que mediaserver escanee inmediatamente un archivo creado a través de ADB

El servidor de medios en mi stock y Android 6.0.1 rooteado (que se ejecuta en Nexus 6) no detecta nuevos archivos creados o movidos a /sdcard usando adb. No se detecta hasta que realizo un reinicio suave/completo que considero inaceptable de realizar.

Puedo ejecutar manualmente mediaserver usando la línea de comandos para comenzar a escanear archivos nuevamente # y quiero que esto se haga de forma automática e inmediata cada vez que se cree un nuevo archivo en /sdcard . En este momento, Tasker ejecuta el servidor de medios cada vez que se desconecta el cable USB. *

La opción obvia aquí parece ser una aplicación de automatización de la cual probé Tasker y Automate , y ambos fallaron sorprendentemente al detectar nuevos archivos, particularmente en /sdcard/Music, cuando se crearon a través de adb. Sin embargo, si una aplicación creaba archivos en cualquier directorio bajo /sdcard, esas dos aplicaciones detectaban inmediatamente los cambios. También intenté enviar archivos a /storage/emulated/0/ en lugar de /sdcard/ e hice los cambios correspondientes en los disparadores de esas dos aplicaciones. Ese paso no me benefició.

Cabe señalar que observé este problema en stock Android 5.1.1 y también en una compilación de instantáneas CM13.

Entonces, ¿cómo logro el objetivo?

Actualizar

Soy consciente de la posibilidad de crear un alias en el sistema operativo que se ejecuta en mi PC que ejecutaría un script que proporcionaría una forma de enviar el archivo y ejecutar el servidor de medios. Sin embargo, es algo que me gustaría evitar tanto como sea posible.

* Lo estaba usando pero luego cambié a un script ejecutado desde la PC usando un alias. Sin embargo, no quiero depender de ninguno de los dos métodos . Mis dedos se sienten cómodos escribiendo adb push en lugar de adb_push o alguna otra palabra única.

Actualización 2

  • No tengo la intención de restringirme a un directorio en particular, como Descargar y tampoco funciona empujar archivos a este último.
  • Me gustaría enfatizar que no estoy preguntando cómo ejecutar mediaserver . Eso ya lo sé. Todo lo que busco es: Cada vez que lo hago, adb push FILE /sdcard/FILEel servidor de medios debe activarse de forma automática e inmediata y escanear el archivo. Independientemente de cualquier problema de rendimiento perceptible, quiero que se active cada vez.

Actualización 3

Bien, puede que esté usando un término incorrecto . Quizás servidor de medios y escáner de medios son términos para dos cosas diferentes en Android. En caso de confusión, utilice el "escáner de medios" tanto para la revisión actual como para la nota de recompensa.

Actualización 4

# Cortesía de androidyue por este útil recurso , cualquiera de los siguientes comandos en texto preformateado es lo que puedo usar en mi dispositivo para hacer que el escáner de medios escanee el archivo.

# FILE_PATH se refiere a la ubicación del archivo enviado en Android. Por ejemplo, /sdcard/Music/lolcat.mp3

Estoy transmitiendo -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 # funcionamiento garantizado. Consulte https://goo.gl/lH0CLT para obtener una prueba.
am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://FILE_PATH

Actualización 5

Por sugerencia de Manubhargav, probé el MTPFix de Sarkie disponible aquí . No funcionó, tanto en stock Android 6.0.1 como CM13. Vi la siguiente entrada cuando habilité el servicio para esa aplicación.

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

Más tarde inserté un archivo de sonido en /storage/emulated/0/ y no apareció nada en mi reproductor de música. Logcat tampoco mostró nada útil.

Por cierto, esta aplicación usa FileObserver , por lo que no me sorprende que no pueda detectar los archivos creados con adb, ya que es el mismo problema con las aplicaciones de automatización que probé.


Nota: publique una respuesta solo cuando la haya probado usted mismo. ¡Gracias!

Encontré esto, está más allá de mi alcance de conocimiento (las respuestas apuntan a alguna herramienta MediaScannerConnection en las herramientas de desarrollo) pero podría ayudar... stackoverflow.com/questions/15147536/…
Nota para los lectores: no me sugieran compilar adb. Eso no lo voy a hacer aunque usted proporcione detalles para ello.
La corrección de MTP de Sarkie (APK que se instalará en el dispositivo) ayuda al servidor de medios a escanear los archivos copiados bajo MTP. Escanea recursivamente el directorio de almacenamiento externo y luego lo agrega a Media Scanner una vez que se ha creado un archivo. También podría ayudar con ADB, vale la pena intentarlo.

Respuestas (2)

Bien, parece que la respuesta es trivial. Mis dedos no tienen que perder la comodidad de escribir adb push, pero podría hacer que el escáner de medios escanee mi archivo enviado, de forma automática e inmediata . Aquí está mi script ajustado a mis necesidades:

( Nota : no se requiere acceso a la raíz en Android)

#!/bin/bash

función empujar_archivo () {
    objetivo="${@: -1}";
    ruta_archivo="${@: -2:1}";
    [[ "$prog_bar" == "-p" ]] && adb "$@" || $call_adb push -p "$file_path" "$objetivo";
}

transmisión de función () {
    nombre_archivo="$(nombre base "$ruta_archivo"");
    [[ `echo "${target: -1}"` != "/" ]] && unset file_name;
    [[ `echo "${objetivo:0:1}"` != "/" ]] && objetivo="/${objetivo}";
    $call_adb shell 'am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d '"\"file://$target$file_name\""'' > /dev/null;
}

si [[ "$1" == "-s" ]]; después
    if [[ "$3" == "empujar" ]]; después
        prog_bar="$4";
        call_adb="adb -s $2";
        push_file "$@" && emisión;
    más
        anuncio "$@";
    fi
elif [[ "$1" == "empujar" ]]; después
        prog_bar="$2";
        call_adb="adb";
        push_file "$@" && emisión;
más
    anuncio "$@";
fi

Luego configuro un alias llamado adb en .bashrc así:

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

Esto fue posible gracias al útil artículo: Manejo de parámetros posicionales en Bash Hackers Wiki.

Nota : el script requiere más o menos un sistema operativo basado en *nix en PC con la versión 4.x de Bash instalada y soporte para .bashrc . Si tiene la intención de utilizar el guión, le recomendamos que lo edite para adaptarlo a su estilo de trabajo.

No estoy seguro de cómo funciona exactamente el escáner de medios, creo que el escáner de medios actualiza constantemente la carpeta de descarga dentro del almacenamiento interno...

si algo no aparece dentro de otra carpeta, lo copio a la carpeta de descarga y activa el escáner de medios...

Intente usar la carpeta de descarga dentro del almacenamiento interno como la ruta absoluta

No. no funciona Por cierto, ¿usted mismo probó este enfoque usando ADB?
adb shell am broadcast android.intent.action.MEDIA_MOUNTED .........De stackoverflow.com/a/19435985/6116090
Creo que malinterpretaste mi pregunta. Prácticamente no tengo ningún problema en ejecutar el servidor de medios manualmente. Mi pregunta es sobre hacer las cosas automáticamente sin ninguna intervención de mi parte. Significa que, tan pronto como lo haga, adb push FILE /sdcard/DIR/el servidor de medios debería activarse y escanear el archivo.
¿Ha intentado crear un archivo por lotes para automatizar el script? Windows es commandlist.bat y Linux es commandlist.sh
Sí. Actualmente estoy usando un script simple y no quiero depender de él. Incluso he abordado esto en mi pregunta. Verifique el contenido debajo de Actualizar en mi pregunta.