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
Por desgracia, UsbStorageActivity
no 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.enableUsbMassStorage
y `StorageManager.disableUsbMassStorage
para 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 MountService
para llamar a su setUsbMassStorageEnabled
función, pero eso estaría fuera de tema para este sitio.
monkey
para 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.service
herramienta 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);
izzy
dan hulme