web-dev-qa-db-fra.com

Comment capturer les événements clés du casque Bluetooth avec android

Mon application peut être contrôlée par un casque normal. Il remplace simplement "onKeyDown". Mais les événements clés du casque Bluetooth ne sont pas capturés - pourquoi? Ou comment capturer les événements clés Bluetooth?

le "log cat" affiche ce qui suit si j'appuie sur le bouton du casque:

Bluetooth AT recv(3043): AT+VGS=15
AudioPolicyManagerBase(13654): FM radio recording off
AudioService(2261): sendVolumeUpdate, isKeyguardLocked...Not to update Volume Panel.
VolumePanel(2261): change volume by MSG_VOLUME_CHANGED
VolumePanel(2261): onVolumeChanged(streamType: 6, flags: 0)
VolumePanel(2261): Call setChangeSeekbarColor(false)

j'ai également essayé de gérer les actions des boutons multimédias, mais cela ne fonctionne pas. mon idée est un mappage de touches configurable gratuit: l'utilisateur choisit "set key" que mon application entend sur toutes les touches (matériel, boutons multimédias, casque bluetooth) puis l'utilisateur appuie sur une touche et le code événement/clé est stocké dans config.

Summerizing ne fonctionne pas Réponses: Les boutons de volume doivent être capturés par "VOLUME_CHANGED_ACTION". Le problème est que ces intentions sont diffusées vers d'autres applications et abortBroadcast () ne fonctionne pas (cela ne fonctionne que pour les diffusions "ordonnées"). Un autre problème est que les touches du casque et du téléphone déclenchent onReceive () deux fois (pourquoi?) Le casque Bluetooth le déclenche une fois. Le prochain problème est la 3e clé du casque Bluetooth. Il déclenche la commande vocale (s-voice démarre sur s3), j'ai essayé de capturer de nombreuses intentions différentes à ce sujet mais je ne peux pas "recevoir" cette pression sur le bouton et je ne sais pas pourquoi. À la fin, je veux capturer toutes sortes de boutons et je ne veux pas qu'ils soient gérés par d'autres applications (comme utiliser onKeyDown et retourner true).

18
dermoritz

Ajoutez un écouteur de diffusion à MEDIA_BUTTON:

<intent-filter Android:priority="<some number>"> 
   <action Android:name="Android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

Vous devez enregistrer votre récepteur de diffusion dans votre application (pas dans le fichier manifeste). Sinon, le lecteur Google Music interceptera votre émission et la montera à bord.

Votre IntentFilter priorité doit être supérieure à celle des autres lecteurs multimédias de votre téléphone)

Ajoutez l'autorisation Android.permission.BLUETOOTH Dans le manifeste pour prendre en charge le casque Bluetooth

Après avoir reçu votre clé, vous devez annuler manuellement la diffusion à l'aide de abortBroadcast().

Cependant, les priorités et abortBroadcast() fonctionnent bien tant que chaque application ne répond que si par ex. quelque chose se joue. Mais plusieurs utilisateurs s'attendent également à ce qu'un "lecteur par défaut" soit lancé (ou commence à jouer) après avoir appuyé sur un bouton, comme le lecteur par défaut, il peut donc arriver qu'une application avec un numéro de priorité plus élevé ne laisse pas l'intention se manifester à votre application.

Dans onReceive, vous pouvez obtenir l'événement button avec

KeyEvent key = (KeyEvent) 
intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

key.getKeyAction() vous indique si le bouton a été relâché ou enfoncé, key.getKeyCode() indique quel bouton est enfoncé.

Si vous souhaitez également gérer des casques de câble à un seul bouton, tenez également compte du code clé KEYCODE_HEADSETHOOK

Remplacez la méthode onKeyDown dans n'importe quelle activité et recherchez le KeyEvent.KEYCODE_MEDIA_KEYCODE_pressed_key

par exemple.

 boolean onKeyDown(int keyCode, KeyEvent event) { 
            AudibleReadyPlayer abc; 
            switch (keyCode) { 
            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 
                    // code for fast forward 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_NEXT: 
                    // code for next 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 
                    // code for play/pause 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
                    // code for previous 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_REWIND: 
                    // code for rewind 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_STOP: 
                    // code for stop 
                    return true; 
            } 
            return false; 
    } 

Exemple d'intégration de touches de volume Android - Boutons de volume utilisés dans mon application
Celui-ci peut nécessiter une autorisation

<uses-permission Android:name="Android.permission.MODIFY_AUDIO_SETTINGS" />


Ou vous pouvez essayer des implémentations plus minces via le lien suivant

Blog des développeurs Android: Gestion des boutons de la télécommande
Contes Android: Ajoutez la prise en charge du bouton Casque à votre Android

29
Yash Krishnan

Découvrez cet article . Il explique comment implémenter quelque chose de similaire en utilisant des actions de bouton multimédia.

Je sais que vous avez mentionné que vous aviez marché de cette façon sans succès, essayez toujours. Attirez votre attention sur les problèmes liés à l'enregistrement du récepteur de diffusion, à la définition des priorités de filtre d'intention et à l'ajout d'autorisations (tous expliqués dans l'article).

J'espère que cela vous aidera.

2
Eugene Loy

Si vous essayez d'écouter cela à partir d'une activité, utilisez onKeyDown() et attrapez KEYCODE_MEDIA_PLAY_PAUSE (KEYCODE_MEDIA_PLAY et KEYCODE_MEDIA_PAUSE post ICS).

De plus, pour que la solution de récepteur de diffusion fonctionne, assurez-vous qu'il n'y a pas d'autres applications installées et exécutées en arrière-plan qui détectent ces événements qui pourraient avoir la priorité sur le vôtre.

Regardez aussi ceci: Android - enregistrement d'un clic sur le bouton du casque avec BroadcastReceiver

1
Slartibartfast