Włączanie (lub wyłączanie) pamięci masowej USB za pomocą poleceń adb

17

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
Anonimowy Howard
źródło
Bardzo dobrze zbadane pytanie, szkoda, że ​​nie zagłosuję dwukrotnie! Dziękujemy za starania i udostępnianie tych pomocnych i już działających poleceń! Przykładowy :) Trzymając kciuki, ktoś może wymyślić brakujący element, bo to by było naprawdę przydatne!
Izzy

Odpowiedzi:

9

Niestety, UsbStorageActivitynie 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 funkcje StorageManager.enableUsbMassStoragei `StorageManager.disableUsbMassStoragewykonuje 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 MountServicedo wywołania jej setUsbMassStorageEnabledfunkcji, ale byłoby to zupełnie nie na temat tej witryny.

Dan Hulme
źródło
1
Ale co dokładnie się stanie, gdy kliknę przycisk „Włącz pamięć USB”? Dlaczego nie można osiągnąć efektu tego naciśnięcia przycisku, nawet jeśli piszesz zupełnie nową aplikację? Czy bardziej inteligentny wariant narzędzia „małpa” nie dałby rady?
Anonimowy Howard,
Wyjaśniłem to w mojej odpowiedzi: wywołuje funkcje, o których wspomniałem, które z kolei wywołują usługę systemową, a usługa systemowa wykonuje całą pracę. Aby uzyskać więcej informacji, musisz przeczytać źródło. Nie można nawet użyć monkeyprzycisku, ponieważ kod jest wyraźnie sprawdzany, aby zatrzymać testy przypadkowo odmontowujące pamięć.
Dan Hulme
Możesz wypróbować servicenarzędzie CLI, które może wywoływać metody obsługi systemu.
Léo Lam
5


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:

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

Aby wyłączyć pamięć masową:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
Amir Brand
źródło
Amir Brand - Próbowałem użyć tej metody, ale nie mogę wyłączyć pamięci USB. Czy to działa z tobą? jeśli tak, czy możesz mi pomóc. dzięki
Khanna
Cześć Khanna Pewnie. Nie ma problemu. Prześlij mi wiadomość na adres [email protected] z problemem, a ja postaram się znaleźć rozwiązanie.
Amir Brand