web-dev-qa-db-fra.com

Accepter un appel via un casque Bluetooth VoIP

Je travaille sur une application VoIP-Android et cette application doit pouvoir accepter/refuser les appels via un casque Bluetooth. 

Mais le problème est qu’après l’ajout de la connexion à SCO 

    audioManager.startBluetoothSco()
    audioManager.isBluetoothScoOn = true

Une fois que je clique sur le bouton du casque, j'entends un son qui vient généralement lorsque j'accepte un appel via la téléphonie. Je suppose donc qu'un composant du système Android capte ce signal sans le rejeter plus loin.

Ce que j'ai déjà essayé:

1) écouteur d'état de téléphonie (il est toujours IDLE) 

   val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
   phoneStateListener = MyPhoneStateListener()
   tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)

2) MediaSession + écouteur silencieux + bouton média Ne fonctionne pas pour le premier clic, le second + les clics sont gérés correctement 

3) Le récepteur MEDIA_BUTTON ne fonctionne pas

J'ai trouvé une question similaire sur SO mais sans la réponse, comment la faire fonctionner Accepter un appel via un casque Bluetooth

Alors, y at-il de toute façon comment je peux intercepter le clic du bouton Bluetooth à partir du service de casque Bluetooth? 

16
Sergey Zabelnikov

Accepter un appel via un casque Bluetooth

Ajout de ma réponse de là à ici aussi.

Ces événements sont gérés en interne dans HeadsetStateMachine (sous packages/apps/Bluetooth).

Ces événements sont transmis à l'interface IBluetoothHeadsetPhone. La seule application à laquelle tous les événements sont transmis est définie au moment de l'exécution en suivant le code de liaison dans HeadsetStateMachine.Java. Cela permet aux fabricants de téléphones de les transférer vers une application de téléphone personnalisée au lieu d'une application par défaut, dans le cas où aucune application par défaut n'est utilisée.

Intent intent = new Intent(IBluetoothHeadsetPhone.class.getName());
    intent.setComponent(intent.resolveSystemService(context.getPackageManager(), 0));
    if (intent.getComponent() == null || !context.bindService(intent, mConnection, 0)) {
        Log.e(TAG, "Could not bind to Bluetooth Headset Phone Service");
    }

Pour que les événements soient transférés vers votre application au lieu de l'application téléphonique par défaut, vous devez modifier le code aosp. Vous devez intercepter les événements sur l’un des connecteurs HeadsetStateMachine, BluetoothHeadsetPhone ou l’application téléphonique.

Malheureusement, ce que vous recherchez n'est actuellement pas possible sans modifier le code aosp. Certains casques tels que Plantronics ont des événements BT personnalisés qui sont transférés à toutes les applications. Certaines applications VoIP existantes prennent en charge ces intentions personnalisées pour prendre en charge au moins la réponse aux appels de certains casques.

0
RocketRandom