режим USB-хоста с iconia a500 и Android 3.2: нет устройств

#android #usb

#Android #usb

Вопрос:

Я пытаюсь связаться с USB-устройством, используя acer iconia a500, обновленную до Android 3.2 (ядро 2.6.36.3 , без рутов, я просто использовал функцию регулярного обновления). В двух словах, происходит то, что после получения UsbManager getDeviceList возвращает пустую карту. То же самое происходит с образцом adbtest от Google:

 mManager = (UsbManager)getSystemService(Context.USB_SERVICE);
// check for existing devices
for (UsbDevice device :  mManager.getDeviceList().values()) {
    // I get nothing here, the values() list is empty
 

Я пробовал несколько устройств (различные твердотельные диски usb, жесткий диск, мышь, часы Garmin и т. Д.). ничего. Некоторые устройства (диски, мышь) действительно распознаются ОС (они работают: я вижу файловую систему, мышь работает нормально и т. Д.), Но они не отражаются на уровне API.

Некоторые люди говорят, что мышь и клавиатура не перечисляются, но диски перечисляются, но они используют 3.1, в то время как я использую 3.2. Я также не получаю диск или что-либо еще, что я подключил.

Приведенный выше код должен перечислять все устройства. В любом случае, я также попробовал подход intent xml file, как описано в примерах Google. По-прежнему ничего.

Манифест кажется нормальным, и, как я уже сказал, образец adbtest прямо из sdk показывает ту же проблему.

Учитывая скудость API, я действительно не знаю, что попробовать дальше. Кто-нибудь успешно использовал режим хоста на iconia a500 с Android 3.2?

РЕДАКТИРОВАТЬ: я имею в виду «используется» на уровне API. Как я уже сказал, «стандартные» устройства распознаются на уровне ОС и работают, но не видны через API. В конце мне нужно связаться с нестандартным устройством в режиме хоста, поэтому мне действительно нужно получить его через API.

РЕДАКТИРОВАТЬ 2: я не собираюсь рутировать свое устройство, потому что мое приложение (если мне когда-нибудь удастся его написать 🙂 было бы бесполезно, если бы требовалось рутирование.

Спасибо!

  • вик

Комментарии:

1. Я использовал клавиатуру, мышь и внешний жесткий диск NTFS с моей Iconia на 3.2.

2. да, как я уже сказал, я тоже. они работают сами по себе, но не перечисляются на уровне API, поэтому, хотя ОС может их видеть, я не могу (поэтому я не могу общаться с нестандартным устройством). Я уточню свой вопрос, спасибо!

3. Возможно, вы сможете связаться с разработчиком «Drive Mount» и узнать, как он работает. Приложение находится здесь: market.android.com/details?id=au.dach.drivemount

4. Я установил приложение, однако для этого требуется, чтобы устройство было внедрено. Это невозможно для моего приложения и не должно требоваться для usb-хоста (но, вероятно, потребуется смонтировать диск). Я еще уточню свой вопрос, спасибо.

Ответ №1:

Убедитесь, что ваш фильтр намерений не скрывает устройства.

http://developer.android.com/guide/topics/usb/host.html

«В общем, используйте идентификатор поставщика и продукта, если вы хотите фильтровать для определенного устройства, и используйте класс, подкласс и протокол, если вы хотите фильтровать для группы USB-устройств, таких как устройства хранения данных или цифровые камеры. Вы можете указать ни один или все эти атрибуты. Указание атрибутов no соответствует каждому USB-устройству, поэтому делайте это только в том случае, если это требуется вашему приложению: »

Скажите мне, работает ли это для вас.

Комментарии:

1. Я только что купил A500. Код, который у вас есть, работает и распознает другие планшеты… но вы правы, что он не распознает мою клавиатуру или мышь.

2. Мой A500 распознает (с помощью API): принтер, usb-накопитель, другие планшеты. Он не распознает: мыши / клавиатуры (даже без фильтров). Странно то (как вы указали), что мыши и клавиатуры работают на A500… они просто не отображаются в списке API «подключенных USB-устройств»

Ответ №2:

Попробуйте этот код,

 mUsbManager = (UsbManager) getSystemService(USB_SERVICE);
HashMap<String, UsbDevice> devicelist = mUsbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = devicelist.values().iterator();

if (deviceIterator.hasNext()) {
    while(deviceIterator.hasNext()) {
        mUsbDeviceX = deviceIterator.next();
        if (mUsbDeviceX != null) {
            Log.v(Log_Tag, "ProdID: "  mUsbDeviceX.getProductId());
            Log.v(Log_Tag, "VendID: "  mUsbDeviceX.getVendorId());
        }
    }
} else {
    Log.v(Log_Tag, "No Usb Devices Attached");
}
 

Если это не сработает, покажите нам вывод dmesg / logcat здесь.