Ein- und Ausschalten des USB-Massenspeichers über ADB-Befehle

17

Hintergrund: Ich habe ein USB-Stick-Android-Gerät (zB RikoMagic), das ich meistens im "headless" -Modus laufe. Unter anderem habe ich bereits herausgefunden, wie man es über eine Kombination aus adb und dem internen "am" -Befehl herunterfährt:

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

Ich versuche jetzt herauszufinden, wie die Unterstützung für USB-Massenspeicher ein- und ausgeschaltet werden kann. Ich habe das Fenster mit den USB-Speicheraktivitäten über den folgenden Befehl geöffnet:

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

Leider konnte ich nicht herausfinden, wie ich die äquivalente "Absicht" zum tatsächlichen "Aufheben" oder "Aufheben" der Freigabe des freigegebenen Volumes (oder zum "Aufheben" oder "Freigeben" für diese Angelegenheit) senden kann. Der folgende Befehl führt nichts aus:

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

Was mache ich falsch? Was ist die magische Beschwörung, um den internen Speicher eines Android-Geräts zu aktivieren / deaktivieren?

Anmerkung 1: Ich weiß, dass es den offensichtlichen Linux-Befehl "mount" / "umount" gibt. Das einfache Aktivieren oder Deaktivieren des Volumes löst jedoch keine Systemfunktionen aus, die beispielsweise für den Neustart oder das Stoppen von Apps erforderlich sind, die auf die SD-Karte verschoben wurden. Ein "umount" wird wahrscheinlich trotzdem fehlschlagen, wenn eine App auf der SD-Karte noch aktiv ist.

Hinweis 2: Anscheinend gibt es einen "setprop" -Befehl, der die USB-Massenspeicherunterstützung aktivieren / deaktivieren kann, BIS zum nächsten Neustart. Auch hier ist dieser Alles-oder-Nichts-Ansatz nicht das, wonach ich suche, sondern die Möglichkeit, den USB-Massenspeicher während einer einzelnen Sitzung ein- und auszuschalten, wie dies über die Touch-Oberfläche möglich ist.

adb shell setprop sys.usb.config mass_storage
Anonymer Howard
quelle
Eine sehr gut recherchierte Frage, ich wünschte, ich könnte sie zweimal verbessern! Vielen Dank für Ihre Bemühungen und das Teilen dieser hilfreichen und bereits funktionierenden Befehle! Vorbildlich :) Finger kreuzen, jemand kann sich das fehlende Teil einfallen lassen, denn das wäre in der Tat nützlich!
Izzy

Antworten:

9

Leider verwendet der UsbStorageActivitykeine Absicht, USB-Massenspeicher zu aktivieren und zu deaktivieren, daher gibt es keine Möglichkeit, dies mithilfe von zu erreichen am. Sie ruft stattdessen die Funktionen auf StorageManager.enableUsbMassStorageund `StorageManager.disableUsbMassStorageerledigt ihre Arbeit. Da diese Funktionen im Framework verborgen sind, ist es auch nicht möglich, eine App dafür zu schreiben. Soweit ich weiß, gibt es keinen Befehl, dies zu tun.

Es ist möglicherweise möglich, eine App zu schreiben, die eine Befehlszeilenschnittstelle bietet und den gebundenen Systemdienst MountServicezum Aufrufen ihrer setUsbMassStorageEnabledFunktion verwendet. Dies ist jedoch für diese Site ein Thema, das nicht zum Thema gehört.

Dan Hulme
quelle
1
Aber was passiert genau, wenn ich auf die Schaltfläche "USB-Speicher einschalten" tippe? Warum ist es nicht möglich, den Effekt dieses Tastendrucks zu erzielen, selbst wenn Sie eine völlig neue App schreiben? Wäre es nicht eine intelligentere Variante des Dienstprogramms "monkey"?
Anonym Howard
Ich habe das in meiner Antwort erklärt: Es ruft die von mir erwähnten Funktionen auf, die wiederum einen Systemdienst aufrufen, und der Systemdienst erledigt die ganze Arbeit. Für weitere Details müssen Sie die Quelle lesen. Sie können nicht einmal monkeyauf die Schaltfläche klicken, da der Code dies explizit überprüft, um Tests zu stoppen, bei denen die Bereitstellung des Speichers versehentlich aufgehoben wurde.
Dan Hulme
Probieren Sie das serviceCLI-Tool aus, mit dem Systemdienstmethoden aufgerufen werden können.
Léo Lam
5


Ich habe versucht, mit dem "StorageManager.enableUsbMassStorage" und dem "StorageManager.disableUsbMassStorage" den Massenspeicher und seine Funktionen zu aktivieren und zu deaktivieren.
Vielen Dank.

Diese Methoden sind private Methoden. Also, wenn du sie benutzen willst, solltest du es durch Reflektion tun. Um diesen Storage Manager abzurufen, können Sie die Methode getSystemService (java.lang.String) verwenden, die in den Aktivitäten enthalten ist:

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

Und Massenspeicher deaktivieren:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
Amir Brand
quelle
Amir Brand- Ich habe versucht, diese Methode zu verwenden, aber ich kann meinen USB-Speicher nicht deaktivieren. Funktioniert es bei dir? Wenn ja, können Sie mir bitte helfen. Danke
Khanna
Hi Khanna Sicher. Kein Problem. Bitte senden Sie mir eine E-Mail mit dem Problem an [email protected] und ich werde versuchen, die Lösung zu finden.
Amir Brand