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
Leider verwendet der UsbStorageActivity
nicht 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.enableUsbMassStorage
und `StorageManager.disableUsbMassStorage
auf, 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 setUsbMassStorageEnabled
Funktion aufzurufen, aber das wäre für diese Site weit vom Thema entfernt.
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.service
Systemdienstmethoden 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);
Izzy
Dan Hulme