Включение (или выключение) USB-накопителя с помощью команд adb

Предыстория: У меня есть 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-карту. «Размонтирование», вероятно, все равно не удастся, если приложение на SD-карте все еще активно.

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

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

Ответы (2)

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

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

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


Я пробовал «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 с проблемой, и я постараюсь найти решение.