18 votes

Activation (ou désactivation) du stockage de masse USB via les commandes adb

Contexte : J'ai une clé USB Android (par exemple RikoMagic) que j'utilise principalement en mode "headless". Entre autres choses, j'ai déjà compris comment l'éteindre via une combinaison de adb et de la commande interne "am" :

adb shell am start -n android/com.android.server.ShutdownActivity

J'essaie maintenant de trouver comment activer et désactiver la prise en charge du stockage de masse USB. J'ai réussi à faire apparaître la fenêtre d'activité de stockage USB via la commande suivante :

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity

Malheureusement, je n'ai pas réussi à trouver comment envoyer l'"intention" équivalente pour "démonter" ou "déspartager" le volume partagé (ou le "monter" ou le "partager" d'ailleurs). La commande suivante ne fait rien :

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard

Qu'est-ce que je fais de mal ? Quelle est l'incantation magique pour monter/démonter le stockage interne d'un appareil Android ?

Note 1 : Je sais qu'il y a la commande Linux "mount"/"umount" évidente. Cependant, le simple fait de monter ou démonter le volume ne déclenchera pas les fonctions système essentielles, par exemple, le redémarrage ou l'arrêt des applications qui ont été déplacées sur la carte SD. Un "umount" échouera probablement de toute façon si une application sur la carte SD est toujours active.

Note 2 : Apparemment, il existe une commande "setprop" qui permet d'activer/désactiver le support de la mémoire de masse USB jusqu'au prochain redémarrage. Encore une fois, cette approche du tout ou rien n'est pas ce que je recherche, mais la possibilité d'activer et de désactiver la mémoire de masse USB au cours d'une seule session, comme cela peut être fait par l'interface tactile.

adb shell setprop sys.usb.config mass_storage

10voto

Andy Brudtkuhl Points 1714

Hélas, le UsbStorageActivity n'utilise pas d'intention pour activer et désactiver la mémoire de masse USB, il n'y a donc aucun moyen d'y parvenir en utilisant l'option am . Il appelle plutôt les fonctions StorageManager.enableUsbMassStorage y `StorageManager.disableUsbMassStorage pour faire son travail. Comme ces fonctions sont cachées dans le framework, il n'est pas non plus possible d'écrire une application pour le faire. Pour autant que je sache, il n'y a pas de commande existante pour faire cela.

Il est possible d'écrire une application qui offre une interface en ligne de commande et utilise le service du système lié. MountService pour appeler son setUsbMassStorageEnabled mais ce serait hors sujet pour ce site.

6voto

Amir Brand Points 151

J'ai essayé "StorageManager.enableUsbMassStorage" et "StorageManager.disableUsbMassStorage" pour activer et désactiver la mémoire de masse et cela fonctionne.
Gracias.

Ces méthodes sont des méthodes privées. Donc, si vous voulez les utiliser, vous devez le faire par réflexion. Pour obtenir ce gestionnaire de stockage, vous pouvez utiliser la méthode getSystemService(java.lang.String) qui est incluse dans les activités :

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

Et pour disbler le stockage de masse :

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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X