Предыстория: У меня есть 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
Увы, UsbStorageActivity
не используется намерение включать и отключать запоминающее устройство USB, поэтому нет способа добиться этого с помощью am
. Вместо этого он вызывает функции StorageManager.enableUsbMassStorage
и `StorageManager.disableUsbMassStorage
выполняет свою работу. Поскольку эти функции скрыты во фреймворке, для этого также невозможно написать приложение. Насколько я знаю, для этого не существует команды.
Возможно, можно написать приложение, которое предлагает интерфейс командной строки и использует связанную системную службу MountService
для вызова своей setUsbMassStorageEnabled
функции, но это было бы не по теме для этого сайта.
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);
Иззи
Дэн Халм