Antecedentes: Tengo un dispositivo Android con memoria USB (por ejemplo, RikoMagic) que ejecuto principalmente en modo "sin cabeza". Entre otras cosas, ya he descubierto cómo cerrarlo mediante una combinación de adb y el comando interno "am":
adb shell am start -n android/com.android.server.ShutdownActivity
Ahora estoy tratando de descubrir cómo activar y desactivar el soporte de almacenamiento masivo USB. Llegué hasta que apareció la ventana de actividad de almacenamiento USB mediante el siguiente comando:
adb shell am start -n com.android.systemui/.usb.UsbStorageActivity
Desafortunadamente, no he podido encontrar la manera de enviar la "intención" equivalente para realmente "desmontar" o "dejar de compartir" el volumen compartido (o "montarlo" o "compartirlo"). El siguiente comando no hace nada:
adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard
¿Qué estoy haciendo mal? ¿Cuál es el encantamiento mágico para montar / desmontar el almacenamiento interno de un dispositivo Android?
Nota 1: Sé que existe el obvio comando "montar" / "desmontar" de Linux. Sin embargo, simplemente montar o desmontar el volumen no activará las funciones del sistema vitales para, por ejemplo, reiniciar o detener aplicaciones que se han movido a la tarjeta SD. Un "umount" probablemente fallará de todos modos cuando una aplicación en la tarjeta SD todavía esté activa.
Nota 2: Aparentemente hay un comando "setprop" que puede habilitar / deshabilitar el soporte de almacenamiento masivo USB hasta el próximo reinicio. Nuevamente, este enfoque de todo o nada no es lo que estoy buscando, sino la capacidad de activar y desactivar el almacenamiento masivo USB durante una sola sesión, como se puede hacer con la interfaz táctil.
adb shell setprop sys.usb.config mass_storage
fuente
Respuestas:
Lamentablemente,
UsbStorageActivity
no tiene la intención de habilitar y deshabilitar el almacenamiento masivo USB, por lo que no hay forma de lograrlo usandoam
. En su lugar, llama a las funcionesStorageManager.enableUsbMassStorage
y`StorageManager.disableUsbMassStorage
a hacer su trabajo. Como estas funciones están ocultas en el marco, tampoco es posible escribir una aplicación para hacer esto. Hasta donde yo sé, no hay un comando existente para hacer esto.Podría ser posible escribir una aplicación que ofrezca una interfaz de línea de comandos y use el servicio del sistema enlazado
MountService
para llamar a susetUsbMassStorageEnabled
función, pero eso estaría fuera de tema para este sitio.fuente
monkey
para hacer clic en el botón, ya que el código tiene una verificación explícita para eso, para detener las pruebas que desmontan accidentalmente el almacenamiento.service
herramienta CLI que puede llamar a los métodos de servicio del sistema.Probé el "StorageManager.enableUsbMassStorage" y el "StorageManager.disableUsbMassStorage" para habilitar y deshabilitar el almacenamiento masivo y sus trabajos.
Gracias.
Que los métodos son privados. Entonces, si quieres usarlos, deberías hacerlo por reflexión. Para obtener ese Storage Manager, puede usar el método getSystemService (java.lang.String) que se incluye en las actividades:
Y para deshabilitar el almacenamiento masivo:
fuente