Увімкнення (або вимкнення) масового зберігання USB за допомогою команд adb


17

Передумови: У мене є пристрій USB-накопичувач Android (наприклад, 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

Дуже добре вивчене питання, хотілося б, щоб я міг його повторити! Дякуємо за ваші зусилля та обмін корисними та вже працюючими командами! Зразково :) Перехрестивши пальці хтось може придумати відсутній шматок, як це справді було б корисно!
Іззі

Відповіді:


9

На жаль, UsbStorageActivityне використовується намір увімкнути та вимкнути масове зберігання USB, тому немає можливості досягти цього за допомогою am. Натомість він викликає функції StorageManager.enableUsbMassStorageта `StorageManager.disableUsbMassStorageвиконує свою роботу. Оскільки ці функції приховані в рамках, також неможливо написати додаток для цього. Наскільки я знаю, для цього немає жодної команди.

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


1
Але що саме відбувається, коли натискаю кнопку "Увімкнути USB-накопичувач"? Чому не можна досягти ефекту цього натискання кнопки навіть тоді, коли ви до кінця пишете зовсім новий додаток? Невже більш розумний варіант утиліти "мавпи" не зробив би цього?
Анонімний Говард

Я пояснив це у своїй відповіді: він викликає згадані мною функції, які в свою чергу викликають системну службу, а системна служба виконує всю роботу. Для більш детальної інформації вам доведеться прочитати джерело. Ви навіть не monkeyможете натиснути кнопку, оскільки в коді є чітка перевірка на це, щоб зупинити тести, випадково відключені сховище.
Dan Hulme

Ви можете спробувати serviceінструмент CLI, який може викликати методи системного обслуговування.
Лео Лам

5


Я спробував "StorageManager.enableUsbMassStorage" та "StorageManager.disableUsbMassStorage", щоб увімкнути та відключити масове зберігання та його роботи.
Спасибі.

Ці методи є приватним методом. Отже, якщо ви хочете їх використовувати, вам слід зробити це за допомогою роздумів. Щоб отримати цей диспетчер пам’яті, ви можете скористатися методом 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);

Amir Brand - Я намагався використовувати цей метод, але я не в змозі відключити моє зберігання usb. Це працює з вами? якщо так, чи можете ви мені допомогти. дякую
Ханна

Привіт, Ханна Звичайно. Без проблем. Будь ласка, надішліть мені пошту на адресу netmir2002@gmail.com із проблемою, і я спробую знайти рішення.
Бренд Аміра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.