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
quelle
Antworten:
Leider verwendet der
UsbStorageActivity
keine Absicht, USB-Massenspeicher zu aktivieren und zu deaktivieren, daher gibt es keine Möglichkeit, dies mithilfe von zu erreichenam
. Sie ruft stattdessen die Funktionen aufStorageManager.enableUsbMassStorage
und`StorageManager.disableUsbMassStorage
erledigt 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
MountService
zum Aufrufen ihrersetUsbMassStorageEnabled
Funktion verwendet. Dies ist jedoch für diese Site ein Thema, das nicht zum Thema gehört.quelle
monkey
auf die Schaltfläche klicken, da der Code dies explizit überprüft, um Tests zu stoppen, bei denen die Bereitstellung des Speichers versehentlich aufgehoben wurde.service
CLI-Tool aus, mit dem Systemdienstmethoden aufgerufen werden können.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:
Und Massenspeicher deaktivieren:
quelle