USB_DEVICE_ATTACHED Намерение не стреляет

Кто-нибудь мог получить работу android.hardware.usb.action.USB_DEVICE_ATTACHED?

Итак, я пытаюсь использовать новые функции режима хоста usb, чтобы обнаружить, когда подключено устройство USB. В моих целях я хочу получать уведомления в любое время, когда устройство подключено. Я не мог этого видеть. Я использую широковещательный приемник, который я знаю, работает (когда у меня есть слух о других вещах, таких как нажатие кнопки дома. Независимо от того, что я пытаюсь, я не вижу намерения стрелять …. Так что Упростите ситуацию, я решил забыть о своем проекте и попытаться использовать собственный пример кода Google и посмотреть, могу ли я хотя бы сделать эту работу. У меня нет одной из пусковых установок, но я решил, что могу хотя бы получить ее USB_Device_Attached Я начал адаптировать код для работы на других устройствах. Сначала я попытался настроить фильтр устройства xml. Я добавил свое устройство (клавиатуру):

<usb-device vendor-id="1050" product-id="0010" /> 

Я получил поставщика и продукт из команды lsusb. Когда устройство подключено, лог-код показывает, что устройство найдено

 D/EventHub( 144): No input device configuration file found for device 'Yubico Yubico Yubikey II'. I/EventHub( 144): New device: id=43, fd=219, path='/dev/input/event8', name='Yubico Yubico Yubikey II', classes=0x80000003, configuration='', keyLayout='/system/usr/keylayout/Generic.kl', keyCharacterMap='/system/usr/keychars/Generic.kcm', builtinKeyboard=false I/InputReader( 144): Device added: id=43, name='Yubico Yubico Yubikey II', sources=0x00000101 I/ActivityManager( 144): Config changed: { scale=1.0 imsi=0/0 loc=en_US touch=3 keys=2/1/1 nav=1/2 orien=L layout=0x10000014 uiMode=0x11 seq=47} D/MissileLauncherActivity(16191): intent: android.intent.action.MAIN I/EventHub( 144): Removed device: path=/dev/input/event8 name=Yubico Yubico Yubikey II id=43 fd=219 classes=0x80000003 I/InputReader( 144): Device removed: id=43, name='Yubico Yubico Yubikey II', sources=0x00000101 I/ActivityManager( 144): Config changed: { scale=1.0 imsi=0/0 loc=en_US touch=3 keys=1/1/2 nav=1/2 orien=L layout=0x10000014 uiMode=0x11 seq=48} D/dalvikvm( 144): GC_EXPLICIT freed 78K, 26% free 14717K/19719K, paused 3ms+3ms D/MissileLauncherActivity(16191): intent: android.intent.action.MAIN 

Xoom находит клавиатуру и ее можно использовать с устройства (я могу использовать его в браузере для ввода букв). И намерение вроде пожаров (но это только срабатывает android.intent.action.MAIN), я никогда не получаю намерение DEVICE_ATTACHED. Запись журнала поступает из кода примера:

 Log.d(TAG, "intent: " + intent.getAction().toString()); 

В функции возобновления. После того, как вы выкапывали и удаляли любую ссылку на usb, я обнаружил, что каждое приложение, которое я делаю, получает, когда возобновляется вызов, когда клавиатура прикреплена / отсоединена (отсюда и запись в файле: android.intent.action.MAIN). Прямо сейчас единственное, что я могу понять, это то, что это ошибка в источнике Android. Кстати, я использую wifi xoom с os 3.1.

Solutions Collecting From Web of "USB_DEVICE_ATTACHED Намерение не стреляет"

У меня тоже была такая же проблема. Наконец, я понял, что в фильтре xml устройства мы должны добавить следующую строку.

 <usb-device vendor-id-"xxxxx" product-id="yyyyy"> 

Xxxxx и yyyyy должны быть десятичными числами. НЕ ХЕСТЫЕ КОДЫ. Тогда все работает как рекламируется! Я знаю, что поздно, но я надеюсь, что это поможет.

Поэтому я нашел решение своей проблемы, и я многому научился, что он может помочь кому-то другому.

Так что сначала HID-устройства не начинают никаких намерений . Они также не отображаются в mUsbManager.getDeviceList() . Однако другие вещи. Я дал карту памяти USB, и что вы знаете, что устройство указано в списке устройств. Я также узнал, что возвращенное устройство не имеет класса, подкласса или протокола. Отладка показала, что родительский интерфейс, однако, имеет соответствующий класс / подкласс и протокол. Также, если у вас должен быть фильтр устройства. Я закончил с class=0008 (USB STORAGE) для работы в моих целях. Я предполагаю, что другие классы тоже будут работать.

Так что теперь нужно разобраться в намерениях. Оказывается, что намерение должно быть привязано к активности запуска. Мои попытки прикрепить его к службе или получателю не принесут никаких плодов. Итак, теперь, когда у меня возникают намерения, я вижу, что всплывающие окна уведомлений, когда я прикрепляю свое устройство (USB-накопитель), спрашивают, как установить мое приложение как значение по умолчанию для этого устройства. Совершенно теперь мое приложение запускается каждый раз, когда я присоединяю это устройство. Обратите внимание, что вам будет предложено указать каждое уникальное устройство. Но только один раз. Похоже, что он зарегистрирован так же, как и программы по умолчанию.

Ну, я думаю, что о том, что я нашел. Слишком плохо, что вы не можете получить уведомление при подключении клавиатуры / мыши. Да, и еще одна вещь. Нет проблем с ядром tiamat, запуском его прямо сейчас и без проблем.

Недавно я обнаружил решение подобной проблемы.

Как уже отмечалось, HID devices не вызывают намерения , и я думаю, что это ваша проблема.

Однако связанная с этим проблема заключается в том, что если ваша программа настроена на запуск при подключении USB-устройства, то даже после того, как приложение будет запущено, вы не сможете захватить действие USB_DEVICE_ATTACHED . Вместо этого система видит это намерение и говорит: «О, это означает, что это приложение хочет запустить (как указано в вашем манифесте), а затем отправляет вам действие android.intent.action.MAIN вместо действия USB_DEVICE_ATTACHED и вызывает onResume() Даже если ваше приложение запущено. Насколько я могу судить, вы НЕ МОЖЕТЕ USB_DEVICE_ATTACHED намерение USB_DEVICE_ATTACHED если ваш манифест заявляет, что ваше приложение будет работать при подключении USB-устройств. Вам просто нужно ввести код в onResume() Чтобы проверить, подключен ли USB. Даже если ваша программа запущена, onResume снова будет вызван при подключении USB-устройства.

Я более подробно останавливаюсь на моем решении: Android 3.1 USB-Host – BroadcastReceiver не получает USB_DEVICE_ATTACHED

Перечислительные устройства

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

 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); 

При желании вы также можете просто получить итератор с хэш-карты и обрабатывать каждое устройство по одному:

 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next() //your code } в UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next() //your code } 

У меня такая же проблема. Моим окончательным решением было использовать старомодную методику опроса. Вот довольно минимальный класс, который решает проблему к моему удовлетворению.

 package com.YourCompancy.YourProduct; import android.app.*; import android.content.*; import android.hardware.usb.*; import java.util.*; import android.util.*; import android.os.*; public class UsbDeviceWatcher extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { UsbDevice d = (UsbDevice) intent.getExtras().get(UsbManager.EXTRA_DEVICE); DeviceConnect(d, false); } } public void DeviceConnect(UsbDevice device, boolean Attached) { if (Attached) { // Some suggestions ... // play sound effect // notify consumer software // determine if interested in device // etc Log.i("usb", "device attached"); } else { Log.i("usb", "device detached"); } } public UsbManager manager; public Handler handler; public UsbDeviceWatcher(Context context, Handler handle) { this.handler = handle; manager = (UsbManager) context.getSystemService(Context.USB_SERVICE); IntentFilter dev = new IntentFilter(); dev.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); context.registerReceiver(this, dev); final UsbDeviceWatcher _this = this; Thread thread = new Thread(new Runnable() { public void run() { LinkedList<UsbDevice> seen = new LinkedList<UsbDevice>(); LinkedList<UsbDevice> attached = new LinkedList<UsbDevice>(); //there is a need for multithread support here // so the thread can watch for an exit condition while (true) { HashMap<String, UsbDevice> D = manager.getDeviceList(); for (UsbDevice d : D.values()) { if (!seen.contains(d)) { if (!attached.contains(d)) { final UsbDevice dev = d; handler.post(new Runnable(){ public void run() { DeviceConnect(dev, true); } }); } seen.add(d); } } for (UsbDevice d : seen) { if (!D.values().contains(d)) seen.remove(d); } try { Thread.sleep(500); } catch (InterruptedException exception) { return; } } } }); thread.start(); } } 

Другим обходным решением является использование

 new FileObserver("/dev/input") { @Override public void onEvent(int event, String path) { //gets called on input device insert / remove } }; 

Который будет работать для некоторых USB-устройств (клавиатура, мышь)

OK больше работы, больше сбоев, но некоторый прогресс.

Я узнал больше из документации sdk. Кажется, что вы должны иметь фильтр устройства, чтобы использовать намерения. Поэтому я решил попробовать использовать фильтр класса вместо идентификаторов поставщиков / продуктов. Я полагаю, что это будет более общим и, надеюсь, поймать спрятанное устройство. Я использовал 03h как идентификатор класса, я пробовал различные форматы, я пробовал подклассы, я даже использовал lsusb для обнаружения, класс, подкласс и протокол моего устройства. Они, похоже, совсем не помогали. Поэтому я пошел дальше в документацию sdk и решил попробовать перечислить все устройства, чтобы увидеть, что os видел целые числа класса / подкласса / протокола. Я скопировал код, вставив его в прослушиватель кликов и добавив операторы log.v. Ничего не отображается в логарифме.

Он выглядит так, как будто система не видит какого-либо устройства (хотя устройство действительно работает). Теперь это очень показательно для устройства, подключенного к USB-устройству, и не стреляющего. Теперь я должен сказать, что я использую собственное ядро ​​в своем xoom (tiamat). Я думал, что это может иметь какое-то отношение к проблеме некоторое время назад, поэтому я вернулся к фонду 3.1. И до сих пор прогресс. Теперь это было некоторое время назад, прежде чем я попытался перечислить, так что теперь я вернусь к агаину и продолжаю работать с запасом, пока не буду уверен, что ядро ​​не является проблемой. Я вернусь, когда узнаю больше. Успеха или неудачи. Конечно, если кто-то еще удержит это лучше, чем я, пожалуйста, звоните. Одна последняя заметка. Я очень беспокоюсь о полном режиме хоста otg, когда я это видел в документации. Обратите внимание, что коэффициент идентичен, даже если он ссылается на два метода перечисление. Вероятно, просто ошибка копирайтеров, но все же беспокоиться об этом в свете всей этой неудачи.

Это то, что я сделал для обнаружения USB / Media Connect.

Файл манифеста

  <receiver android:name=".UsbReceiver" android:enabled="true" > <intent-filter> <action android:name="android.intent.action.MEDIA_MOUNTED"/> <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> <data android:scheme="file"/> </intent-filter> </receiver> 

Я ничего не делал в своей деятельности, кроме моего получателя.

Похоже, что эта линия делает материал.

 <data android:scheme="file"/> 

Из моего тестирования Android может запускать намерение, когда подключено устройство HID. (Приложение примера MissileLauncher делает именно это. Дополнительную информацию см. В примере исходного кода.)

Ракетная пусковая установка (Dream Cheeky USB Missle Launcher) Устройство HID имеет свой подкласс и протокол, установленный в 0x00. Для получения дополнительной информации см .: http://www.mattcutts.com/blog/playing-with-a-usb-missile-launcher/

Суть в том, что Android не бросает намерение специально для мыши и клавиатуры (возможно, больше). Однако я могу обнаружить HID-устройства, у которых есть свой интерфейсClass = 0x03, InterfaceSubClass = 0x00, InterfaceProtocol = 0x00. Для моего приложения мое HID-устройство является встроенным контроллером, поэтому настройка подкласса и протокола не является проблемой.

У меня установлено мое приложение как launchMode="singleTop" и в этом режиме он выглядит как getIntent().getAction() всегда равен действию, которое сначала запустило приложение.

Поэтому, если вы запустите приложение вручную, а затем подключите устройство (даже после перехода от этого приложения), вы получите android.intent.action.MAIN .

Если вы убьете приложение, а затем подключите его, вы всегда получите android.hardware.usb.action.USB_DEVICE_ATTACHED , даже если вы отключаетесь и возвращаетесь в приложение, или даже для поворота устройства .

Я действительно странно получаю намерения при отключении USB-устройства, которое, как мне кажется, не документировано, но, конечно, я получаю USB_DEVICE_ATTACHED когда мое устройство отключено.

Без singleTop он работает как ожидалось, но затем вы получаете еще одну тупую дополнительную активность, если ваше приложение уже открыто и вы подключаете устройство.

В очередной раз API Android является ошибкой, чрезмерно сложной и сложной в использовании.

Подключите USB-клавиатуру WONT fire USB_DEVICE_ATTACHED .

Вместо этого система будет запускать Intent.ACTION_CONFIGURATION_CHANGED . Однако при изменении конфигурации система перезапустит Activity. Вы не поймаете действие с перезапуском Activity. В этом случае вам нужно добавить android: configChanges = «keyboard | keyboardHidden» в вашем манифесте Android, чтобы активность не перезапускалась после подключения внешней клавиатуры.