18 votos

Alternando almacenamiento masivo USB encendido (o apagado) a través de comandos adb

Antecedentes: Tengo un dispositivo Android en forma de memoria USB (por ejemplo, RikoMagic) que principalmente ejecuto en modo "headless". Entre otras cosas, ya he descubierto 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 averiguar cómo activar y desactivar el soporte de almacenamiento masivo USB. He llegado al punto de 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 averiguar cómo enviar el "intent" equivalente para realmente "desmontar" o "dejar de compartir" el volumen compartido (o "montar" 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 la fórmula mágica para montar/desmontar el almacenamiento interno de un dispositivo Android?

Nota 1: Sé que está el comando Linux obvio "mount"/"umount". Sin embargo, simplemente montar o desmontar el volumen no activará funciones del sistema vitales para, por ejemplo, reiniciar o detener aplicaciones que se han movido a la tarjeta SD. Un "unmount" probablemente fallará de todos modos cuando una aplicación en la tarjeta SD siga 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 alternar el almacenamiento masivo USB activado y desactivado durante una sola sesión, como se puede hacer con la interfaz táctil.

adb shell setprop sys.usb.config mass_storage

0 votos

Una pregunta muy bien investigada, ¡ojalá pudiera darle dos votos positivos! ¡Gracias por tus esfuerzos y por compartir esos comandos útiles y que ya funcionan! ¡Ejemplar :) Cruzando los dedos para que alguien pueda encontrar la pieza faltante, ¡pues eso sería realmente útil!

10voto

Andy Brudtkuhl Puntos 1714

Lamentablemente, la UsbStorageActivity no utiliza un intent para habilitar y deshabilitar el almacenamiento masivo USB, por lo que no hay forma de lograr esto usando am. En cambio, llama a las funciones StorageManager.enableUsbMassStorage y StorageManager.disableUsbMassStorage para hacer su trabajo. Dado que estas funciones están ocultas en el framework, no es posible escribir una aplicación para hacer esto tampoco. Hasta donde yo sé, no existe un comando existente para hacer esto.

Puede ser posible escribir una aplicación que ofrezca una interfaz de línea de comandos y use el servicio del sistema vinculado MountService para llamar a su función setUsbMassStorageEnabled, pero eso estaría muy fuera de tema para este sitio.

1 votos

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 haría el truco una variante más inteligente de la utilidad "monkey"?

0 votos

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 puedes usar monkey para hacer clic en el botón, ya que el código tiene una comprobación explícita para eso, para evitar que las pruebas desmonten accidentalmente el almacenamiento.

0 votos

Podrías probar la herramienta CLI service que puede llamar a los métodos del servicio del sistema.

6voto

Amir Brand Puntos 11

He probado el "StorageManager.enableUsbMassStorage" y el "StorageManager.disableUsbMassStorage" para habilitar y deshabilitar el almacenamiento masivo y funciona.
Gracias.

Esos métodos son métodos privados. Por lo tanto, si deseas utilizarlos, debes hacerlo mediante reflexión. Para obtener ese Administrador de Almacenamiento, podrías utilizar el método getSystemService(java.lang.String) que está incluido 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);

0 votos

Amir Brand- He intentado usar este método pero no puedo desactivar mi almacenamiento USB. ¿Te está funcionando a ti? Si es así, ¿puedes ayudarme por favor? Gracias

0 votos

Hola Khanna. Claro. Sin problema. Por favor envíame un correo a netmir2002@gmail.com con el problema y trataré de encontrar la solución.

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