Ein- (oder Ausschalten) des USB-Massenspeichers über adb-Befehle

Hintergrund: Ich habe ein USB-Stick-Android-Gerät (zB RikoMagic), das ich meistens im "headless"-Modus betreibe. Unter anderem habe ich schon 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 ich die Unterstützung für USB-Massenspeicher ein- und ausschalten kann. Ich bin so weit gekommen, dass das USB-Speicheraktivitätsfenster über den folgenden Befehl angezeigt wird:

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

Leider konnte ich nicht herausfinden, wie ich die äquivalente "Absicht" senden kann, um das freigegebene Volume tatsächlich zu "unmounten" oder "freizugeben" (oder "mounten" oder "freigeben" für diese Angelegenheit). Der folgende Befehl tut nichts:

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 zum Mounten/Unmounten des internen Speichers eines Android-Geräts?

Anmerkung 1: Ich weiß, dass es den offensichtlichen Linux-Befehl "mount"/"umount" gibt. Das einfache Mounten oder Unmounten des Volumes löst jedoch keine wichtigen Systemfunktionen aus, um beispielsweise Apps neu zu starten oder zu stoppen, die auf die SD-Karte verschoben wurden. Ein "umount" wird wahrscheinlich sowieso fehlschlagen, wenn eine App auf der SD-Karte noch aktiv ist.

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

adb shell setprop sys.usb.config mass_storage
Eine sehr gut recherchierte Frage, ich wünschte, ich könnte sie zweimal positiv bewerten! Vielen Dank für Ihre Bemühungen und das Teilen dieser hilfreichen und bereits funktionierenden Befehle! Vorbildlich :) Daumen drücken, jemand kann das fehlende Stück finden, denn das wäre in der Tat nützlich!

Antworten (2)

Leider verwendet der UsbStorageActivitynicht die Absicht, den USB-Massenspeicher zu aktivieren und zu deaktivieren, daher gibt es keine Möglichkeit, dies mit zu erreichen am. Stattdessen ruft es die Funktionen StorageManager.enableUsbMassStorageund `StorageManager.disableUsbMassStorageauf, um seine Arbeit zu erledigen. Da diese Funktionen im Framework versteckt sind, ist es auch nicht möglich, eine App dafür zu schreiben. Soweit ich weiß, gibt es dafür keinen Befehl.

Es könnte möglich sein, eine App zu schreiben, die eine Befehlszeilenschnittstelle bietet und den gebundenen Systemdienst verwendet MountService, um ihre setUsbMassStorageEnabledFunktion aufzurufen, aber das wäre für diese Site weit vom Thema entfernt.

Aber was genau passiert, wenn ich auf die Schaltfläche „USB-Speicher aktivieren“ tippe? Warum ist es nicht möglich, den Effekt dieses Tastendrucks zu erzielen, selbst wenn Sie zum Extrem gehen, eine ganz neue App zu schreiben? Würde eine intelligentere Variante des "Monkey"-Dienstprogramms nicht ausreichen?
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 mehr Details müssen Sie die Quelle lesen. Sie können nicht einmal verwenden monkey, um auf die Schaltfläche zu klicken, da der Code eine explizite Prüfung dafür hat, um Tests zu stoppen, die versehentlich Speicher unmounten.
Sie könnten das CLI-Tool ausprobieren , das serviceSystemdienstmethoden aufrufen kann.


Ich habe den "StorageManager.enableUsbMassStorage" und den "StorageManager.disableUsbMassStorage" ausprobiert, um den Massenspeicher und seine Funktionen zu aktivieren und zu deaktivieren.
Danke.

Diese Methoden sind private Methoden. Wenn Sie sie also verwenden möchten, sollten Sie dies durch Reflexion tun. Um diesen Storage Manager zu erhalten, 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 um den Massenspeicher zu deaktivieren:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
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
Hallo Khanna Sicher. Kein Problem. Bitte senden Sie mir eine E-Mail mit dem Problem an netmir2002@gmail.com und ich werde versuchen, die Lösung zu finden.