3 votos

Activar manualmente MediaScanner para escanear archivos en el almacenamiento interno en Nougat/Oreo

Suelo gestionar mis archivos en Termux con scripts que utilizan el mv para moverlos o renombrarlos. Quiero activar manualmente MediaProvider para escanear mi stroage interno ( /storage/emulated/0 ) o un directorio determinado en él con la línea de comandos, en un teléfono que ejecute Nougat u Oreo.

Cuando utilizo una aplicación de gestión de archivos con interfaz gráfica, todos los movimientos/renombramientos se reflejan inmediatamente en otras aplicaciones dependientes de MediaScanner como la Galería, pero los cambios realizados en un terminal no lo hacen, hasta que se reinicie. Así que tengo que llamar manualmente a MediaScanner para actualizar mis cambios en el sistema de archivos.

Antes de KitKat, esto funcionaba bien en /storage/sdcard0 (una partición separada llamada glow ):

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

El comando anterior no funciona ahora ( /storage/emulated/0 ), obviamente.

También he probado esto, pero parece que tampoco funciona.

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

Acabo de probar los comandos de nuevo, parecen funcionar en el almacenamiento extraíble como /storage/sdcard1 , /storage/usba o /storage/{volume id} (se vuelve a escanear), pero no el interno de mi teléfono (donde /sdcard señala, o /storage/emulated/0 ).

¿Alguien tiene alguna idea? Reiniciar mi teléfono siempre provoca una nueva exploración, pero eso es un inconveniente en algunos casos.

Nota: los comandos se ejecutan como Root, así que no hay que preocuparse por los permisos.

0 votos

¿Disparar una emisión de que la tarjeta SD estaba montada? Eso activa implícitamente el escáner de medios, ya que necesita comprobar los posibles añadidos que hayas hecho a la tarjeta. Ese es el primer comando que has mencionado. Me pregunto por qué esto ya no funciona. ¿Has probado? // Otra idea: en algunos dispositivos he encontrado una entrada correspondiente en los ajustes del desarrollador, que te permite activar un nuevo escaneo. Merece la pena echarle un vistazo.

0 votos

@Izzy No tarjeta SD, sino almacenamiento interno. Supongo que es el almacenamiento interno el que causa el problema (no escaneado en realidad).

0 votos

No sé cómo hacer esto desde adb, pero creo que se puede ir a Ajustes - Aplicaciones - Todas las aplicaciones, a continuación, pulse el menú de 3 puntos y seleccione Mostrar sistema, a continuación, desplácese hacia abajo para Media Storage y abrirlo, pulse Almacenamiento, a continuación, Borrar datos y después de que se complete el reinicio. Eso funciona en dispositivos Moto con Nougat y Oreo, puede que no sea lo que buscas, pero debe neto el mismo resultado.

4voto

Firelord Puntos 161

Nota : Es posible que los siguientes comandos no le funcionen sólo con el usuario de depuración USB / shell (uID 2000). En ese caso, debe tener acceso a root para hacerlos funcionar .


Antes de KitKat, esto funcionaba bien:

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

El comando anterior no funciona ahora, obviamente.

Esto funciona perfectamente bien en mi stock Android 7.1.1 (Nexus 6) que tiene sólo el almacenamiento interno. Pero desde Oreo no se permiten las transmisiones implícitas , por lo que tienes que enviar una emisión explícita a Media Storage . Esto puede hacerse utilizando el argumento -n seguido por el nombre del componente o simplemente por -p seguido del nombre del paquete. En Android 9.0 (OnePlus 6), esto es lo que me funcionó:

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

Creo que el comando anterior también funcionaría para Android Oreo.

Nota: shell (usuario 2000) no puede ejecutar ese comando, por lo que debe elevar los privilegios a sistema (1000) o Root (0). En resumen, ejecuta el comando como Root o no funcionará.


También he probado esto, pero parece que tampoco funciona.

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

Porque esa intent espera un ARCHIVO como dato, no un directorio (entiendo que todo es un archivo en Linux, pero no es el caso de una intent). Proporcione la ruta completa de un archivo y funcionaría. Además, como se ha dicho anteriormente, para Oreo y superiores, hacer la transmisión explícita .

Si tiene varios archivos y pretende utilizar sólo esta intent, debe obtener todos los nombres de los archivos y pasarlos a la intent de forma recursiva (por Aritra Roy en Stack Overflow). Puede ser posible pasar un array pero no sé cómo hacerlo con adb.

Además, mi Android se comportaba de forma bastante errática con los nombres de archivos que contenían [] .

0 votos

En Android 10 (Huawei Mate 20 Pro), obtuvo error de Security exception: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=28279, uid=2000 al intentar ejecutar adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard/ -p com.android.providers.media

0 votos

@pvd perdón por la respuesta tardía. Sí, veo que también me da el mismo error en OnePlus 6 corriendo Android 10. Sin embargo, ejecutando el mismo comando con acceso Root funciona correctamente. He añadido una nota en mi respuesta para recalcar la necesidad del acceso Root, en caso de que el comando no funcione. Gracias por avisarme.

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