Détecter lorsqu'un périphérique USB est détaché sur Android
J'ai une application Android qui doit détecter lorsqu'un périphérique USB est connecté ou déconnecté. Il fonctionne très bien lorsque le périphérique est d'abord attaché, mais je ne reçois aucune notification (c'est à dire, je ne reçois pas une Intent
dont l'action est ACTION_USB_DEVICE_DETACHED
) quand il est ensuite détaché.
Voici la partie pertinente de mon AndroidManifest.xml
:
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
</activity>
Il peut également être intéressant de noter que LauncherActivity
n'existe que pour démarrer un Service
lorsque l'appareil est connecté, et pour arrêter le service lorsqu'il est détaché. Dans les deux cas, LauncherActivity
toujours finish
es lui-même immédiatement. Tout cela se produit dans LauncherActivity.onCreate
.
Des idées?
- Hi, consultez ce post stackoverflow.com/a/9814826/760489
Vous devez vous connecter pour publier un commentaire.
USB_DEVICE_DETACHED est un diffusion intention, donc vous pouvez déclarer le BroadcastReceiver dans le manifeste avec les intent-filter pour l'action détachée, aussi avec des méta-données associées.
En va de même pour USB_ACCESSORY_DETACHED, pour qui est intéressé.
Résumé:
USB_XXX_ATTACHED est une activité intention
USB_XXX_DETACHED est une émission intention
(où XXX = APPAREIL | ACCESSOIRE)
Voir: http://developer.android.com/guide/components/intents-filters.html
"Il n'y a pas de chevauchement au sein de ces systèmes de messagerie: Diffusion intentions sont remis qu'à des récepteurs de radiodiffusion, ne jamais à des activités ou des services"
DEVICE
actions sont à la fois des émissions. PourACCESSORY
, le joint est une activité d'action, mais le détaché dans une émission d'action.Essayer avec USB_STATE comme ci-dessous.
Il mettra le feu à la fois attaché et détache de même récepteur et dans le démodulateur vous pouvez identifier que c'était jointe ou d'détache de l'événement.
Récepteur:
Donc, je n'ai jamais eu le
ACTION_USB_DEVICE_DETACHED
Intent
pour aller àLauncherActivity
; je ne sais pas ce que l'affaire est là, sans doute quelque chose que je ne pas bien comprendre à propos des filtres d'intention ou de laActivity
callbacks.La solution que j'ai utilisé vient de la poste lié par la Pratique. En gros, j'ai tout pris sur
USB_DEVICE_DETACHED
deAndroidManifest.xml
. Puis, dans laonCreate
méthode de laService
, je me suis inscrit unBroadcastReceiver
comme ceci:Un peu maladroit, et je suis toujours curieux de savoir pourquoi juste en ajoutant
USB_DEVICE_DETACHED
à la<intent-filter>
deLauncherActivity
ne fonctionnait pas, mais il le fait ce dont j'ai besoin.Pour ce que ça vaut, j'ai eu ce même problème, parce que l'activité est interrompue puis reprise lorsque l'appareil est déconnecté.
Depuis le récepteur est enregistré dans l'
OnPause()
méthode juste avant de recevoir leACTION_USB_DEVICE_DETACHED
, votre application n'est jamais avisé.Le correctif qui a fonctionné pour moi a été d'annuler l'inscription dans
onPause()
et de s'inscrire de nouveau dansonResume()
:Cependant, bien que l'application semble toujours recevoir le DÉTACHER de l'événement, de temps en temps il ne peut pas faire l'événement ATTACHÉ. Je puis avoir besoin de brancher et de le et débranchez le connecteur USB, et il fonctionne généralement après une ou deux tentatives. J'ai mis le blâme de cette étrange comportement sur le système d'exploitation, sans certitude.