8 votos

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

El mediaserver en mi Android 6.0.1 stock y rooteado (corriendo en el Nexus 6) no detecta nuevos archivos creados o movidos a en /sdcard usando adb. No detecta hasta que hago un reinicio suave / completa que me parece inaceptable para llevar a cabo.

Soy capaz de ejecutar manualmente mediaserver utilizando la línea de comandos para comenzar la exploración de archivos de nuevo # y quiero que esto se haga de forma automática e inmediata cada vez que se cree un nuevo archivo en /sdcard . De momento, hago que Tasker ejecute el mediaserver cada vez que se desenchufa el cable USB. *

La opción obvia aquí parece ser una aplicación de automatización de la cual probé Tasker y Automatice y, sorprendentemente, ambos no detectan los nuevos archivos, especialmente en /sdcard/Music, cuando se crean a través de adb. Sin embargo, si una aplicación creaba archivos en cualquier directorio bajo /sdcard esas dos aplicaciones detectaron inmediatamente los cambios. También probé a enviar archivos a /almacenamiento/emulado/0/ en lugar de /sdcard/ e hice los cambios correspondientes en los activadores de esas dos aplicaciones.Ese paso no me benefició.

Hay que tener en cuenta que he observado este problema en Android 5.1.1 de stock y en una build de CM13 snapshot también.

Entonces, ¿cómo lograr el objetivo?

Actualización

Estoy al tanto de la posibilidad de crear un alias en el sistema operativo que se ejecuta en mi PC, el cual ejecutaría un script proporcionando una manera de empujar el archivo, así como ejecutar el mediaserver. Sin embargo, es algo que me gustaría evitar en la medida de lo posible.

* Yo lo utilizaba, pero luego cambié a un script ejecutado desde el PC utilizando 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 pero única palabra.

Actualización 2

  • No tengo la intención de restringirme a un directorio en particular, como por ejemplo Download y tampoco funciona el empuje de archivos en este último.
  • Me gustaría subrayar que no estoy pidiendo cómo ejecutar mediaserver . Eso ya lo sé. Todo lo que estoy buscando es: Cuando hago adb push FILE /sdcard/FILE el mediaservidor debería activarse automática e inmediatamente y escanear el archivo. Independientemente de cualquier problema de rendimiento perceptible, quiero que se ponga en marcha cada vez.

Actualización 3

De acuerdo, Puede que esté utilizando un término incorrecto . Quizás mediaservidor y escáner de medios son términos para dos cosas diferentes en Android. En caso de confusión, por favor, quédese con "escáner de medios" tanto para la revisión actual como para la nota de recompensa.

Actualización 4

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

\# FILE\_PATH refers to the location of pushed file in Android. E.g. /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   # guaranteed to work. See https://goo.gl/lH0CLT for proof.
am broadcast -a android.intent.action.MEDIA\_MOUNTED -d file://FILE\_PATH 

Actualización 5

Según la sugerencia de Manubhargav, probé el MTPFix de Sarkie disponible aquí . No funcionó, tanto en Android 6.0.1 de stock como en 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 introduje un archivo de sonido en /almacenamiento/emulado/0/ y no aparecía nada en mi reproductor de música. Logcat tampoco mostraba nada útil.

Por cierto, esta aplicación utiliza FileObserver Así 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 he probado.


Nota: Por favor, publique una respuesta sólo cuando lo haya probado usted mismo. Gracias.

0 votos

He encontrado esto, está fuera de mi alcance de conocimiento (las respuestas apuntan a alguna herramienta MediaScannerConnection en herramientas de desarrollador) pero podría ayudar... stackoverflow.com/questions/15147536/

0 votos

Nota a los lectores: por favor, no me sugieras que compile adb. Eso no lo voy a hacer aunque me facilitéis detalles para ello.

0 votos

Arreglo MTP de Sarkie (APK a instalar en el dispositivo) ayuda a mediaserver a escanear los archivos copiados bajo MTP. Escanea recursivamente el Directorio de Almacenamiento Externo y luego se añade al Escáner de Medios una vez que se ha creado un archivo. Podría ayudar con ADB también, vale la pena intentarlo.

2voto

Firelord Puntos 161

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

( <strong>Nota </strong>: El acceso a root es <em>no </em>necesario en Android)

#!/bin/bash

function push\_file () {
    target="${@: -1}";
    file\_path="${@: -2:1}";
    \[\[ "$prog\_bar" == "-p" \]\] && adb "$@" || $call\_adb push -p "$file\_path" "$target";
}

function broadcast () {
    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;
}

if \[\[ "$1" == "-s" \]\]; then
    if \[\[ "$3" == "push" \]\]; then
        prog\_bar="$4";
        call\_adb="adb -s $2";
        push\_file "$@" && broadcast;
    else
        adb "$@";
    fi
elif \[\[ "$1" == "push" \]\]; then
        prog\_bar="$2";
        call\_adb="adb";
        push\_file "$@" && broadcast;
else
    adb "$@";
fi

A continuación, configuro un alias llamado adb en .bashrc así:

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

Esto ha sido posible gracias a este artículo tan útil: Tratamiento de los parámetros de posición en Bash Hackers Wiki.

Nota El sistema de gestión de la información: 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 tienes intención de utilizar el script, te animamos a que lo edites para adaptarlo a tu estilo de trabajo.

0voto

user157947 Puntos 51

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 descargas dentro del almacenamiento interno...

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

Pruebe a utilizar la carpeta Download dentro de Internal Storage como ruta absoluta

0 votos

No. No funciona. Por cierto, ¿has probado este método con ADB?

0 votos

Adb shell am broadcast Android.intent.action.MEDIA_MOUNTED .........From stackoverflow.com/a/19435985/6116090

0 votos

Creo que no ha entendido mi pregunta. No tengo prácticamente ningún problema en ejecutar el mediaserver manualmente. Mi pregunta se refiere a hacer las cosas automáticamente sin ninguna intervención por mi parte. Es decir, tan pronto como hago adb push FILE /sdcard/DIR/ mediaserver debería entrar en acción y escanear el archivo.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X