Включение (или выключение) запоминающего устройства USB с помощью команд adb

17

Предыстория: у меня есть Android-устройство на USB-накопителе (например, RikoMagic), которое я в основном использую в режиме «без головы» Помимо прочего, я уже понял, как его отключить, используя комбинацию adb и внутренней команды «am»:

adb shell am start -n android/com.android.server.ShutdownActivity

Сейчас я пытаюсь понять, как включить и отключить поддержку USB-накопителей. Я дошел до появления окна активности USB-накопителя с помощью следующей команды:

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

К сожалению, я не смог выяснить, как отправить эквивалентное «намерение», чтобы фактически «размонтировать» или «расшарить» общий том (или «смонтировать» или «поделиться» им в этом отношении). Следующая команда ничего не делает:

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard

Что я делаю неправильно? Каково волшебное заклинание монтировать / размонтировать внутреннее хранилище устройства Android?

Примечание 1: я знаю, что есть очевидная команда Linux "mount" / "umount". Однако простое подключение или отключение тома не вызовет системных функций, необходимых, например, для перезапуска или остановки приложений, которые были перемещены на SD-карту. «Umount», вероятно, в любом случае потерпит неудачу, если приложение на SD-карте все еще активно.

Примечание 2: Очевидно, есть команда «setprop», которая может включить / отключить поддержку USB-накопителя до следующей перезагрузки. Опять же, этот подход «все или ничего» - это не то, что я ищу, а возможность включать и выключать USB-накопитель в течение одного сеанса, как это можно сделать с помощью сенсорного интерфейса.

adb shell setprop sys.usb.config mass_storage
Аноним Ховард
источник
Очень хорошо изученный вопрос, хотелось бы, чтобы я проголосовал дважды! Спасибо за ваши усилия и поделитесь этими полезными и уже работающими командами! Образцовый :) Скрестив пальцы, кто-то может придумать недостающую часть, поскольку это было бы действительно полезно!
Иззи

Ответы:

9

Увы, UsbStorageActivityон не использует намерение включать и отключать запоминающее устройство USB, поэтому нет способа добиться этого с помощью am. Вместо этого он вызывает функции StorageManager.enableUsbMassStorageи `StorageManager.disableUsbMassStorageвыполняет свою работу. Поскольку эти функции скрыты в каркасе, также невозможно написать приложение для этого. Насколько я знаю, не существует команды для этого.

Может быть возможно написать приложение, которое предлагает интерфейс командной строки и использует связанную системную службу MountServiceдля вызова своей setUsbMassStorageEnabledфункции, но это было бы не по теме для этого сайта.

Дэн Халм
источник
1
Но что именно происходит, когда я нажимаю на кнопку «Включить USB-накопитель»? Почему невозможно добиться эффекта нажатия этой кнопки, даже если вы дошли до крайности написания целого нового приложения? Разве более разумный вариант утилиты «обезьяна» не сработает?
Аноним Ховард
Я объяснил это в своем ответе: он вызывает функции, которые я упомянул, которые, в свою очередь, вызывают системный сервис, а системный сервис выполняет всю работу. Для более подробной информации вам нужно прочитать исходный код. Вы даже не можете monkeyнажать кнопку, поскольку в коде есть явная проверка, чтобы остановить тесты, случайно отключившие хранилище.
Дэн Халм
Вы можете попробовать serviceинструмент CLI, который может вызывать методы системного обслуживания.
Лео Лам
5


Я попытался «StorageManager.enableUsbMassStorage» и «StorageManager.disableUsbMassStorage», чтобы включить и отключить запоминающее устройство и его работу.
Благодарю.

Эти методы являются частным методом. Итак, если вы хотите использовать их, вы должны делать это с помощью размышлений. Чтобы получить этот Storage Manager, вы можете использовать метод getSystemService (java.lang.String), который включен в действия:

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

И отключить хранилище:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);
Амир Брэнд
источник
Амир Бранд - я пытался использовать этот метод, но я не могу отключить USB-накопитель. Это работает с вами? если да, не могли бы вы помочь мне. спасибо
Ханна
Привет Ханна Конечно. Нет проблем. Пожалуйста, отправьте мне письмо на netmir2002@gmail.com с проблемой, и я постараюсь найти решение.
Амир Брэнд