USB_DEVICE_ATTACHED Intention de ne pas de tir
A quelqu'un là-bas été en mesure d'obtenir le android.matériel.usb.d'action.USB_DEVICE_ATTACHED" au travail?
Ok, donc je suis en train d'utiliser le nouvel hôte usb fonctionnalités du mode de détecter lorsqu'un périphérique usb est connecté. Pour mes fins, je veux être informé de tout temps un appareil est branché. Je n'étais pas capable de le voir arriver. Je suis à l'aide d'un récepteur de radiodiffusion que je sais œuvres (quand je l'ai écouter d'autres choses telles que le bouton home enfoncé. Peu importe ce que j'essaie, je n'arrive pas à obtenir de l'intention d'incendie.... Donc, pour simplifier les choses, j'ai décidé d'oublier mon projet et de la tentative d'utilisation de google des exemples de code et de voir si je pouvais au moins faire en sorte que le travail. Je n'ai pas l'une de l'lanceur de missiles, mais j'ai pensé que je pourrais au moins obtenir le USB_Device_Attached à feu. Sans aller. J'ai adapté le code fonctionne pour d'autres appareils. J'ai d'abord essayé le réglage de l'appareil filtre xml.
J'ai ajouté mon périphérique (clavier):
<usb-device vendor-id="1050" product-id="0010" />
J'ai eu le vendeur et de produit à partir d'une commande lsusb. Lorsque l'appareil est relié, le logcat indique que l'appareil est trouvé
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
La xoom ne trouve que le clavier et il est utilisable à partir de l'appareil (je peux l'utiliser dans le navigateur pour taper des lettres). Et l'intention de tri des incendies (mais il ne feux de le android.l'intention.d'action.PRINCIPAL) je ne suis pas toujours d'obtenir les DEVICE_ATTACHED Intention. L'entrée de journal vient de l'exemple de code:
Log.d(TAG, "intent: " + intent.getAction().toString());
Dans la fonction de reprise. Après plus de creuser et de suppression de toute référence à l'usb, j'ai trouvé que toutes les applications que je fais est le résumé appelée lorsqu'un clavier est relié/détaché (d'où l'intention: android.l'intention.d'action.PRINCIPALE entrée de journal).
Maintenant la seule chose que je peux comprendre, c'est que c'est un bug dans la source android.
Par la façon dont je suis sur un wifi xoom avec l'os 3.1.
- J'étais sur le point de recommander à la recherche par le biais de la plate-forme de code source pour comprendre ce que c'est vraiment censé faire... et puis je me suis souvenu 🙁 Une idée: avez - vous de USB gadget autour de qui n'est pas un périphérique HID qui vous pourriez essayer?
Vous devez vous connecter pour publier un commentaire.
J'ai également eu le même problème. J'ai enfin compris que, dans le dispositif de filtre xml, il convient d'ajouter la ligne suivante.
xxxxx et yyyyy doivent être des nombres décimaux. PAS DE CODES HEX. Puis, tout fonctionne comme annoncé!
Je sais qu'il est tard mais j'espère que cela aide.
<usb-device vendor-id="0BDA" product-id="8187"/>
MAL<usb-device vendor-id="3034" product-id="33159"/>
DROITJ'ai donc trouvé une solution à mon problème et j'ai beaucoup appris, j'espère que ça peut aider quelqu'un d'autre.
Donc tout d'abord périphériques HID ne pas un coup de pied hors de toute intention. Ni-elles dans le
mUsbManager.getDeviceList()
liste. D'autres choses cependant ne. J'ai donné un bâton de mémoire usb de un aller et ce que vous connaissez le périphérique est répertorié dans la liste des périphériques. J'ai aussi découvert que l'appareil retourné ne pas avoir la classe,sous-classe, ou d'un protocole. Le débogage a révélé que la mère de l'interface a cependant eu la bonne classe/sous-classe/et le protocole.Aussi, si vous devez avoir un filtre de périphérique. J'ai fini avec un
class=0008 (USB STORAGE)
de travailler pour mes fins. Je devine que les autres classes marcherait aussi bien.Alors maintenant, à essayer de comprendre les intentions. S'avère que l'intention doit être attaché à un lanceur d'activité. Mes tentatives pour le joindre à un service ou le récepteur ne porte pas de fruits. Donc, maintenant que je suis tente de feu, je vois maintenant les notifications de popup quand j'attache mes périphériques usb (mémoire flash) il me demande de mettre mon application par défaut pour cet appareil. Parfait maintenant, mon application est exécuté à chaque fois que j'attache de l'appareil. Notez que vous serez invité pour chaque périphérique unique. Mais une fois seulement. Il semble être enregistrés comme les programmes par défaut.
Bien, je pense qu'environ résume ce que j'ai trouvé. dommage que vous ne pouvez pas être averti quand un clavier/souris sont attachées. Oh et encore une chose. Il n'y a pas de problèmes avec le kernel tiamat, la course en ce moment et pas de problèmes.
InterfaceSubClass = 0x00
etInterfaceProtocol = 0x00
cause l'intention de se produire. Voir ma réponse pour plus d'info.J'ai récemment découvert une solution à un problème similaire.
Comme quelqu'un l'a déjà noté,
HID devices
ne pas lancer un intention, qui était, je pense, de votre question.Cependant, une question connexe est que, si votre programme est configuré pour s'exécuter lorsqu'un périphérique USB est connecté, puis même une fois que votre demande est en cours d'exécution, vous ne pouvez pas capturer la
USB_DEVICE_ATTACHED
action. Au lieu de cela, le système voit que l'intention, et dit: "oh, cela signifie que cette application veut exécuter (tel que déclaré dans le manifeste) et ensuite il vous envoie le android.l'intention.d'action.PRINCIPALE action au lieu de laUSB_DEVICE_ATTACHED
action, et il appelleonResume()
. Même si votre application est en cours d'exécution. Donc autant que je peux dire, vous ne POUVEZ PAS capturer laUSB_DEVICE_ATTACHED
intention si votre manifeste déclare que votre application s'exécute lorsque les périphériques USB sont connectés. Vous avez juste à mettre un peu de code dansonResume()
pour vérifier si le câble USB est connecté. Même si votre programme est en cours d'exécution, onResume sera appelée lorsqu'un périphérique USB est connecté.Je note ma solution dans plus de détails ici: Android 3.1 USB-Host - BroadcastReceiver ne reçoit pas USB_DEVICE_ATTACHED
De l'énumération des périphériques
Si votre demande est intéressé à l'inspection de tous les périphériques USB actuellement connectés pendant que votre application est en cours d'exécution, il peut énumérer les périphériques sur le bus. Utiliser le getDeviceList() méthode pour obtenir un hash carte de tous les périphériques USB qui sont connectés. Le hachage de la carte est fixé par le périphérique USB nom si vous voulez obtenir un appareil de la carte.
Si vous le souhaitez, vous pouvez aussi obtenir un itérateur à partir de la valeur de hachage de la carte et de traitement de chacun des appareils un par un:
J'ai eu le même problème. Mon ultime solution a été d'utiliser la bonne vieille technique d'interrogation. Ici est assez classe minimale qui permet de résoudre le problème à ma satisfaction.
Une autre solution consiste à utiliser
qui va travailler pour certains périphériques usb (clavier, souris)
OK plus de travail, plus l'échec, mais certains progrès.
J'ai trouvé plus à partir de la documentation du kit de développement. il semble que vous devez avoir de l'appareil filtre afin d'utiliser les intentions. j'ai donc décidé d'essayer d'utiliser un filtre de classe à la place du vendeur/produit id. Je me figure qu'il serait plus général et, espérons-le attraper le périphérique hid. J'ai utilisé 03h que l'id de classe , j'ai essayé plusieurs formats, j'ai essayé les sous-classes, j'ai même utilisé la commande lsusb pour découvrir, classe, sous-classe, ainsi que le protocole de mon appareil. ces ne semble pas l'aider du tout. je suis donc allé plus loin dans la documentation du kit de développement et a décidé d'essayer d'énumérer tous les périphériques pour voir ce que l'os vu la classe/sous-classe/protocole entiers. J'ai copié le code collé dans l'écouteur de clics et de l'ajout de journal.v consolidés. rien n'indique dans le logcat .
il semble, comme le système américain n'est pas de voir n'importe quel appareil (même si l'appareil fonctionne réellement.) maintenant, c'est très indicitive de l'appareil USB connecté intention de ne pas tirer. maintenant, je dois dire que je suis à l'aide d'un noyau personnalisé dans ma xoom (tiamat). J'ai pensé que cela pourrait avoir quelque chose à voir avec le problème il y a un moment, j'ai donc revenue à stock 3.1. et encore maintenant progrès. maintenant, c'était il y a longtemps, avant j'ai essayé de l'énumération, alors maintenant, je vais revenir agaian et de continuer à travailler avec le bouillon jusqu'à ce que je suis sûr que le noyau n'est pas la question. Je vais vérifier De suite quand je l'ai trouvé plus. le succès ou l'échec. bien sûr, si quelqu'un d'autre unterstands cela mieux que moi s'il vous plaît carillon.
une dernière note, je suis un grand inquiet à propos de l'ensemble de l'otg host mode quand j'ai vu cela dans la documentation.. avis que le conseil de l'europe est identique même pensé qu'il fait référence à deux méthodes de dénombrement. probablement juste une copie écrivains erreur, mais encore s'inquiéter certains à la lumière de cet échec.
J'ai mon application défini comme
launchMode="singleTop"
et dans ce mode, il semble que lagetIntent().getAction()
est toujours égale à l'action qui a commencé en premier à l'application.Donc, si vous lancez l'application manuellement et puis branchez un périphérique (même après la mise à l'écart de l'application), vous recevrez
android.intent.action.MAIN
.Si vous tuez l'application, puis branchez l'appareil en, vous obtiendrez toujours
android.hardware.usb.action.USB_DEVICE_ATTACHED
, même à partir de commutation à l'écart et à l'arrière de votre application, ou même pour la rotation de l'appareil.J'ai fait bizarrement recevoir des intentions lorsque vous débranchez le périphérique USB, qui je ne pense pas prouvé - mais bien sûr, je reçois
USB_DEVICE_ATTACHED
quand mon appareil est débranché.Sans
singleTop
, il n'genre de travail que prévu, mais ensuite, vous obtenez un autre stupide activité supplémentaire si votre application est déjà ouverte et vous branchez l'appareil.Une fois de plus, Android API est buggé, trop complexe et difficile à utiliser.
C'est ce que j'ai fait pour détecter USB/Media Connect.
Fichier manifeste
Je n'ai rien dans l'activité, ni de mon récepteur.
ressemble cette ligne est en train de faire les choses.
De mes tests, Android peut le feu d'une intention lorsqu'un périphérique HID est connecté. (Le MissileLauncher exemple d'application est juste que. Voir l'exemple de code source pour plus d'info.)
Le Lanceur de Missiles (Dream Cheeky USB Lanceur de Missiles) HID Périphérique a son sous-classe et le protocole défini à 0x00. Pour plus d'infos, voir: http://www.mattcutts.com/blog/playing-with-a-usb-missile-launcher/
Le problème, c'est que Android ne jette pas l'intention de la souris et du clavier appareils spécifiquement (peut-être plus). Je peux toutefois de détecter les périphériques HID qui ont leur InterfaceClass = 0x03, InterfaceSubClass = 0x00, InterfaceProtocol = 0x00. Pour ma demande, mon périphérique HID est un contrôleur embarqué la sous-classe et le protocole n'est pas un problème.
Connecter Clavier Usb l'HABITUDE de feu USB_DEVICE_ATTACHED.
Au lieu de cela, le Système d'incendie Intention.ACTION_CONFIGURATION_CHANGED. Cependant, comme il y a un changement de configuration, le système va redémarrer l'Activité. Vous ne saisissez l'action avec le redémarrage de l'Activité. Dans ce cas, vous devez ajouter android:configChanges="clavier|keyboardHidden" dans votre Manifeste Android de sorte que l'Activité ne sera pas redémarré une fois un clavier externe est connecté.