Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Я более подробно излагаю мое решение: Android 3.1 USB-хост - BroadcastReceiver не получает USB_DEVICE_ATTACHED

Ответ 4

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

Если ваше приложение заинтересовано в проверке всех 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
}

Ответ 5

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

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();
    }
}

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

Это то, что я сделал для обнаружения 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"/>

Ответ 9

Из моего тестирования 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-устройство является встроенным контроллером, поэтому настройка подкласса и протокола не является проблемой.

Ответ 10

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

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

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

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

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

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

Ответ 11

Подключить клавиатуру Usb WONT пожар USB_DEVICE_ATTACHED.

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