Проблема USB-хоста Android с планшетом Samsung Galaxy 10.1

Я пытаюсь использовать возможности USB-хоста на планшете Samsung Galaxy. Я приобрел ключ для подключения у Samsung (http://www.samsung.com/us/mobile/galaxy-tab-accessories/EPL-1PL0BEGSTA). Когда я впервые подключил USB-устройство через этот ключ, у меня была ошибка высокой мощности от Galaxy Tablet — к вашему сведению, я использую USB-концентратор с внешним питанием, и вы можете обойти это.

Теперь, когда само устройство признает наличие периферийного USB-устройства, когда я его подключаю, я попытался использовать Android android.hardware.usb.UsbDevice; импортировать android.hardware.usb.UsbManager; библиотека. Я видел, что есть два метода распознавания USB-устройства: регистрация широковещательного приемника для прослушивания намерений через

IntentFilter usbIntentFilter = new IntentFilter();
usbIntentFilter.addAction("android.hardware.usb.action.USB_DEVICE_ATTACHED");          
usbIntentFilter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED"); 
registerReceiver(mUsbReceiver,usbIntentFilter);

Это не вызывает никаких намерений, когда я подключаю какие-либо устройства, странно... хорошо. Поэтому я решил попробовать следующий метод: явный запрос списка устройств через UsbManager — это было выполнено следующим образом:

HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    int count = deviceList.size();
    Iterator<UsbDevice> iterator = deviceList.values().iterator();

    if(iterator.hasNext()){
    UsbDevice deviceVal = iterator.next();
    testTxtView1.setText("set device " + deviceVal); 
    }

Предположительно, это захватит одно USB-устройство (в настоящее время поддерживается только одно USB-устройство согласно документации Google) USB-устройство, которое в настоящее время подключено. Чтобы проверить это, я бы вызвал приведенный выше код нажатием кнопки и отобразил результаты устройства. По какой-то причине я каждый раз получаю устройство из списка устройств, независимо от того, подключен USB-ключ или нет. Кроме того, устройство всегда одно и то же, независимо от USB-ключа (или его отсутствия). Результат выглядит следующим образом:

устройство usbDevice[mName=/dev/bus/usb/001/002,mVendorId=1256,mProductId=27033,mClass=0,mSubClass=0,mProtocol=0,mInterfaces=[Landroid.os.Parcelable;@406ff4d8]

^^ значение @406ff4d8 меняется каждый раз, когда я запрашиваю этот код (я просто помещаю его один экземпляр)

Я искал везде и не смог найти похожих проблем или решений, которые могли бы относиться к моей ситуации. Я попытался реализовать примеры USB из Google (по сути, это именно то, что у меня есть, я разорвал их) и столкнулся с этими проблемами.

Я также должен упомянуть состав моего манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="edu.mit.ll.drm4000"
  android:versionCode="1"
  android:versionName="1.0">
<uses-feature android:name="android.hardware.usb.host" />
<uses-sdk android:minSdkVersion="12" />

<application android:icon="@drawable/icon" android:label="@string/app_name">


    <activity android:name=".DRM4000Activity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
        </intent-filter>

        <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
            android:resource="@xml/device_filter" />

    </activity>

</application>

and device filter:


(Я удалил критерии в фильтре устройств, но также пытался вставить конкретную информацию об устройстве, которое я ищу... безрезультатно.)

Любая помощь в отношении этой проблемы будет высоко оценена!


Еще одно обновление: устройство, на которое я жаловался, всегда перечислялось в списке устройств.

устройство usbDevice[mName=/dev/bus/usb/001/002,mVendorId=1256,mProductId=27033,mClass=0,mSubClass=0,mProtocol=0,mInterfaces=[Landroid.os.Parcelable;@406ff4d8]

должен быть USB-порт на стороне Android или что-то в этом роде... потому что я начал подключать кучу разных устройств к своему коду и обнаружил, что (похоже на эту ссылку: USB_DEVICE_ATTACHED Намерение не срабатывает) HID-устройства, устройства arduino... и, к сожалению... мое USB-устройство, похоже, не запускает намерение или не перечисляется USB центр. Я попробовал с USB-накопителем, и он ДЕЙСТВИТЕЛЬНО перечислил его и работал ... однако он отображается как ВТОРОЕ устройство в списке, первым из которых является постоянно присутствующий usbDevice, указанный выше. Тем не менее, намерения срабатывают с этим.

Кто-нибудь знает обходной путь для запуска намерений с HID-устройствами и другими USB-устройствами, за исключением нескольких избранных Android, которые, похоже, делают сейчас?


person hinklecw    schedule 23.09.2011    source источник
comment
можете ли вы убедиться, что USB-хост работает для любых других приложений? Попробуйте подключить PTP-камеру и посмотрите, заметит ли галерея передаваемое намерение. Я предполагаю, что вы пытались перезагрузить компьютер и обновили вкладку до последней версии.   -  person Jon Willis    schedule 24.09.2011
comment
Когда я подключаю клавиатуру, она работает. Когда я подключаю его, я получаю сообщение о подключении USB-устройства. Однако приведенный выше код дает мне тот же результат с клавиатурой, другим подключенным USB-устройством или без него. Я не понимаю, почему он утверждает, что видит USB-устройство. несмотря ни на что. Я знаю, что это должно быть что-то с моим кодом, так как клавиатура распознается очень хорошо. Кстати: когда я подключаю другое устройство, он говорит, что подключено неизвестное USB-устройство   -  person hinklecw    schedule 26.09.2011
comment
Еще одно обновление: устройство, на которое я жаловался, всегда перечисляемое в списке устройств, должно быть USB-портом Android или чем-то еще ... потому что я начал присоединять к своему коду кучу разных устройств и обнаружил, что (аналогично этой ссылке: USB_DEVICE_ATTACHED Intent not запуск) HID-устройства, устройства arduino и мое USB-устройство не запускают намерение или не пересчитываются USB-концентратором. Я попробовал с USB-накопителем, и он ДЕЙСТВИТЕЛЬНО перечислил его и работал ... однако он отображается как ВТОРОЕ устройство в списке, первым из которых является постоянно присутствующий usbDevice, указанный выше. Тем не менее, намерения срабатывают с этим.   -  person hinklecw    schedule 26.09.2011


Ответы (6)


К сожалению, похоже, что Samsung Galaxy Tablet просто плохо работает с UsbManager и примерно с половиной USB-устройств в мире. Ядро в Samsung, похоже, запускает намерения для устройств хранения и тому подобного, но не для HID и других случайных устройств (таких как arduino, мой USB-сенсор, а также HID-устройства). Похоже, это ошибка в ядре Samsung. Что интересно, на планшете HID устройства РАБОТАЮТ, а на UsbManager не перечисляются. Я нашел несколько ссылок на ту же проблему, и похоже, что патч ядра (или планшет acer) - единственные способы обойти эту проблему. надеюсь самсунг исправит в будущем. Вот ссылка на парня, который сделал патч для ядра, если вам нужна пересборка ядра, и вам действительно нужно, чтобы UsbManager работал. Я не проверял, но планирую в конечном итоге и оставлю комментарий о своих мыслях. http://forum.xda-developers.com/showthread.php?t=1233072

person hinklecw    schedule 28.09.2011
comment
Патч ядра, на который вы ссылаетесь, здесь не применяется. Это для Samsung Galaxy Tab 7, но родитель говорит о Samsung Galaxy Tab 10.1, поскольку он нацелился на Honeycomb как на минимальный SDK в своем манифесте. - person Stephan Branczyk; 03.10.2011
comment
ДЕЙСТВИТЕЛЬНО ли до сих пор нет доступных обновлений, позволяющих заставить USB-хост-режим работать на Samsung без каких-либо изменений? Я использую Acer Iconia 500, и там все работает без проблем - я бы хотел, чтобы это было и на Samsung. - person user387184; 29.12.2011

Я столкнулся с той же проблемой, но вы можете использовать один метод deviceName(), после перечисления устройства вы можете сохранить имя устройства в строке, используя метод device.getdeviceName().

вы получите точное имя устройства кроме полной информации об устройстве.

person maanbhati    schedule 13.02.2012

Samsung удалила USB API из ядра Android

person Justus    schedule 02.10.2011

Я думаю, вам следует указать устройство, которое вы хотите распознать, в файле resource/xml/device_filter.xml. вы можете обратиться к Android API.

person vivi.vi    schedule 13.06.2013

Может быть и другая (неприятная) причина, по которой вы не видите свое HID-устройство.

UsbHostManager.beginUsbDeviceAdded() "Вызывается из JNI в monitorUsbHostBus() для сообщения о новых USB-устройствах". Этот метод вызывает частный метод isBlackListed(), который безоговорочно отфильтровывает все HUB и HID с подклассом BOOT. Это может быть причиной того, что вы не видите HID-устройства при выполнении getDeviceList()

Если у кого-то есть обходной путь для этого, я думаю, что есть немало пользователей, которые были бы признательны за это.

person M Webjorn    schedule 27.03.2017

Я успешно подключил свой Arduino Uno к моему Samsung Galaxy Tab 10 P7500. Если у вас возникли проблемы с подключением, это связано с тем, что планшет запрещает доступ к USB-устройствам, не имеющим внешнего питания. Попробуйте подключить устройство к внешнему источнику питания с помощью адаптера переменного/постоянного тока на 5 или 3,3 В. В первый раз, если вы обнаружите, что ваше устройство подключено и активирует намерение, отключите адаптер питания, и ваше устройство будет работать без внешнего источника питания, сам планшет подать питание через USB OTG

person Resdianto Affandi    schedule 16.12.2014