Activar (o desactivar) el almacenamiento masivo USB a través de comandos adb

17

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
Howard anónimo
fuente
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 a alguien se le ocurre la pieza que falta, ya que eso sería útil.
Izzy

Respuestas:

9

Lamentablemente, UsbStorageActivityno tiene 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.disableUsbMassStoragea 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 MountServicepara llamar a su setUsbMassStorageEnabledfunción, pero eso estaría fuera de tema para este sitio.

Dan Hulme
fuente
1
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 vas al extremo de escribir una aplicación completamente nueva? ¿No funcionaría una variante más inteligente de la utilidad "mono"?
Anónimo Howard
Lo he explicado 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á 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 detener las pruebas que desmontan accidentalmente el almacenamiento.
Dan Hulme
Puede probar la serviceherramienta CLI que puede llamar a los métodos de servicio del sistema.
Léo Lam
5


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:

 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
fuente
Amir Brand: he intentado utilizar este método, pero no puedo desactivar mi almacenamiento usb. ¿Está trabajando contigo? en caso afirmativo, ¿podría ayudarme? Gracias
Khanna
Hola khanna seguro No hay problema. Envíeme un correo electrónico a [email protected] con el problema e intentaré encontrar la solución.
Amir Brand