Tło: Mam urządzenie Android z pamięcią USB (np. RikoMagic), które najczęściej uruchamiam w trybie „bezgłowym”. Między innymi już wymyśliłem, jak to wyłączyć za pomocą kombinacji adb i wewnętrznego polecenia „am”:
adb shell am start -n android/com.android.server.ShutdownActivity
Próbuję teraz dowiedzieć się, jak włączyć i wyłączyć obsługę pamięci masowej USB. Mam tak daleko, że okno aktywności pamięci USB wyskakuje za pomocą następującego polecenia:
adb shell am start -n com.android.systemui/.usb.UsbStorageActivity
Niestety nie byłem w stanie dowiedzieć się, jak wysłać równoważną „intencję”, aby faktycznie „odmontować” lub „udostępnić” udostępniony wolumin (lub „zamontować” lub „udostępnić” go w tym przypadku). Następujące polecenie nic nie robi:
adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard
Co ja robię źle? Jaka jest magiczna inkantacja do montowania / odmontowywania wewnętrznej pamięci urządzenia z Androidem?
Uwaga 1: Wiem, że istnieje oczywiste polecenie Linuxa „mount” / „umount”. Jednak samo zamontowanie lub odmontowanie woluminu nie uruchomi funkcji systemowych niezbędnych do na przykład ponownego uruchomienia lub zatrzymania aplikacji przeniesionych na kartę SD. „Umount” prawdopodobnie i tak się nie powiedzie, gdy aplikacja na karcie SD jest nadal aktywna.
Uwaga 2: Najwyraźniej istnieje polecenie „setprop”, które może włączyć / wyłączyć obsługę pamięci masowej USB do momentu następnego uruchomienia. Ponownie, to podejście wszystko albo nic nie jest tym, czego szukam, ale możliwością włączania i wyłączania pamięci masowej USB podczas jednej sesji, co można zrobić za pomocą interfejsu dotykowego.
adb shell setprop sys.usb.config mass_storage
źródło
Odpowiedzi:
Niestety,
UsbStorageActivity
nie używa zamiaru włączania i wyłączania pamięci masowej USB, więc nie ma sposobu, aby to osiągnąć za pomocąam
. Zamiast tego wywołuje funkcjeStorageManager.enableUsbMassStorage
i`StorageManager.disableUsbMassStorage
wykonuje swoją pracę. Ponieważ te funkcje są ukryte w środowisku, nie można również napisać aplikacji, aby to zrobić. O ile mi wiadomo, nie ma istniejącego polecenia, aby to zrobić.Może być możliwe napisanie aplikacji, która oferuje interfejs wiersza polecenia i używa powiązanej usługi systemowej
MountService
do wywołania jejsetUsbMassStorageEnabled
funkcji, ale byłoby to zupełnie nie na temat tej witryny.źródło
monkey
przycisku, ponieważ kod jest wyraźnie sprawdzany, aby zatrzymać testy przypadkowo odmontowujące pamięć.service
narzędzie CLI, które może wywoływać metody obsługi systemu.Próbowałem „StorageManager.enableUsbMassStorage” i „StorageManager.disableUsbMassStorage”, aby włączyć i wyłączyć pamięć masową i jej działanie.
Dzięki.
Te metody są metodą prywatną. Tak więc, jeśli chcesz ich użyć, powinieneś to zrobić przez odbicie. Aby uzyskać ten Storage Manager, możesz użyć metody getSystemService (java.lang.String), która została uwzględniona w działaniach:
Aby wyłączyć pamięć masową:
źródło