Activer (ou désactiver) le stockage de masse USB via les commandes adb

17

Contexte: J'ai un périphérique Android à clé USB (par exemple RikoMagic) que j'exécute principalement en mode "sans tête". Entre autres choses, j'ai déjà compris comment l'arrêter via une combinaison d'adb et de la commande interne "am":

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

J'essaie maintenant de comprendre comment activer et désactiver la prise en charge du stockage de masse USB. J'ai obtenu jusqu'à ce que la fenêtre d'activité de stockage USB s'affiche via la commande suivante:

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

Malheureusement, je n'ai pas été en mesure de comprendre comment envoyer l '"intention" équivalente pour réellement "démonter" ou "dissocier" le volume partagé (ou "monter" ou "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 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 évidente Linux "mount" / "umount". Cependant, le simple montage ou démontage du volume ne déclenchera pas les fonctions système vitales pour, 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 quand une application sur la carte SD est toujours active.

Remarque 2: Apparemment, il existe une commande "setprop" qui peut activer / désactiver la prise en charge du stockage de masse USB JUSQU'AU prochain redémarrage. Encore une fois, cette approche tout ou rien n'est pas ce que je recherche, mais la possibilité d'activer et de désactiver le stockage de masse USB pendant une seule session, comme cela peut être fait par l'interface tactile.

adb shell setprop sys.usb.config mass_storage
Anonyme Howard
la source
Une question très bien documentée, j'aimerais pouvoir la voter deux fois! Merci pour vos efforts et pour avoir partagé ces commandes utiles et qui fonctionnent déjà! Exemplaire :) Croiser les doigts, quelqu'un peut trouver la pièce manquante, car cela serait utile en effet!
Izzy

Réponses:

9

Hélas, le UsbStorageActivityn'utilise pas l'intention d'activer et de désactiver le stockage de masse USB, il n'y a donc aucun moyen d'y parvenir en utilisant am. Il appelle plutôt les fonctions StorageManager.enableUsbMassStorageet `StorageManager.disableUsbMassStoragefait son travail. Comme ces fonctions sont masquées dans le framework, il n'est pas possible non plus d'écrire une application pour ce faire. Pour autant que je sache, il n'y a aucune commande existante pour le faire.

Il pourrait être possible d'écrire une application qui offre une interface de ligne de commande et utilise le service système lié MountServicepour appeler sa setUsbMassStorageEnabledfonction, mais ce serait hors sujet pour ce site.

Dan Hulme
la source
1
Mais que se passe-t-il exactement lorsque j'appuie sur le bouton "Activer le stockage USB"? Pourquoi n'est-il pas possible d'obtenir l'effet de cette pression sur un bouton même lorsque vous allez à l'extrême de l'écriture d'une toute nouvelle application? Une variante plus intelligente de l'utilitaire "singe" ne ferait-elle pas l'affaire?
Anonyme Howard
Je l'ai expliqué dans ma réponse: il appelle les fonctions que j'ai mentionnées, qui à leur tour appellent un service système, et le service système fait tout le travail. Pour plus de détails, vous devrez lire la source. Vous ne pouvez même pas utiliser monkeypour cliquer sur le bouton, car le code a une vérification explicite pour cela, pour arrêter les tests de démontage accidentel du stockage.
Dan Hulme
Vous pouvez essayer l' serviceoutil CLI qui peut appeler des méthodes de service système.
Léo Lam
5


J'ai essayé le "StorageManager.enableUsbMassStorage" et le "StorageManager.disableUsbMassStorage" pour activer et désactiver le stockage de masse et ses travaux.
Merci.

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) 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 désactiver 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);
Marque Amir
la source
Amir Brand - J'ai essayé d'utiliser cette méthode mais je ne suis pas en mesure de désactiver mon stockage USB. Cela fonctionne-t-il avec vous? Si oui, pouvez-vous m'aider s'il vous plaît .Merci
Khanna
Salut Khanna, bien sûr. Aucun problème. Veuillez m'envoyer un mail à [email protected] avec le problème et j'essaierai de trouver la solution.
Amir Brand