Activar (o desactivar) el almacenamiento masivo USB mediante comandos adb

Antecedentes: Tengo un dispositivo Android con memoria USB (p. ej., RikoMagic) que principalmente ejecuto en modo "sin cabeza". Entre otras cosas, ya descubrí cómo apagarlo 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. He llegado a hacer que aparezca 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 descubrir cómo enviar la "intención" equivalente para "desmontar" o "dejar de compartir" el volumen compartido (o "montarlo" o "compartirlo" para el caso). 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 conjuro mágico para montar/desmontar el almacenamiento interno de un dispositivo Android?

Nota 1: Sé que existe el comando obvio "montar"/"desmontar" de Linux. Sin embargo, simplemente montar o desmontar el volumen no activará las funciones vitales del sistema, por ejemplo, reiniciar o detener las aplicaciones que se han movido a la tarjeta SD. Un "desmontaje" 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 lo puede hacer la interfaz táctil.

adb shell setprop sys.usb.config mass_storage
Una pregunta muy bien investigada, ¡ojalá pudiera votarla dos veces! ¡Gracias por sus esfuerzos y por compartir esos comandos útiles y que ya funcionan! Ejemplar :) Cruzando los dedos, alguien puede encontrar la pieza que falta, ¡ya que eso sería realmente útil!

Respuestas (2)

Por desgracia, UsbStorageActivityno utiliza la intención de habilitar y deshabilitar el almacenamiento masivo USB, por lo que no hay forma de lograrlo usando am. En su lugar, llama a las funciones StorageManager.enableUsbMassStoragey `StorageManager.disableUsbMassStoragepara 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 existe ningún comando 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 MountServicepara llamar a su setUsbMassStorageEnabledfunción, pero eso estaría fuera de tema para este sitio.

Pero, ¿qué sucede exactamente cuando toco el botón "Activar almacenamiento USB"? ¿Por qué no es posible lograr el efecto de presionar este botón incluso cuando llegas al extremo de escribir una aplicación completamente nueva? ¿No sería suficiente una variante más inteligente de la utilidad "monkey"?
Lo expliqué en mi respuesta: llama a las funciones que mencioné, que a su vez llaman a un servicio del sistema, y ​​el servicio del sistema hace todo el trabajo. Para más detalles tendrás que leer la fuente. Ni siquiera puede usar monkeypara hacer clic en el botón, ya que el código tiene una verificación explícita para eso, para evitar que las pruebas desmonten accidentalmente el almacenamiento.
Puede probar la serviceherramienta CLI que puede llamar a los métodos de servicio del sistema.


Probé "StorageManager.enableUsbMassStorage" y "StorageManager.disableUsbMassStorage" para habilitar y deshabilitar el almacenamiento masivo y sus obras.
Gracias.

Esos métodos son métodos privados. Entonces, si quieres usarlos, debes hacerlo por reflexión. Para obtener ese Administrador de almacenamiento, puede usar el método getSystemService(java.lang.String) que se incluye en las actividades:

 StorageManager storage = (StorageManager)getApplicationContext().getSystemService(STORAGE_SERVICE);
 Method method = storage.getClass().getDeclaredMethod("enableUsbMassStorage");
 method.setAccessible(true); 
 Object r = method.invoke(storage);

Y para deshabilitar el almacenamiento masivo:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
Amir Brand: he intentado usar este método, pero no puedo desactivar mi almacenamiento USB. ¿Está trabajando contigo? Si es así, ¿pueden ayudarme? Gracias.
Hola Khanna Claro. No hay problema. Por favor envíeme un correo a netmir2002@gmail.com con el problema e intentaré encontrar la solución.