web-dev-qa-db-fra.com

Accepter un appel via un casque Bluetooth

je travaille sur une application VoIP-Android. Je souhaite accepter et refuser les appels via un casque Bluetooth connecté dans une activité. 

Ce que j'ai essayé jusqu'à présent:

  • Utilisation de Media Session pour recevoir les clics sur le bouton Media. 

    Problème: Si nous démarrons BluetoothSCO nous ne recevons aucun clic sur le bouton multimédia. Si nous ne démarrons pas BluetoothSCO, nous recevons des clics sur le bouton multimédia, mais nous ne pouvons pas différencier les clics longs et courts car le temps mort est toujours égal à 0. Le code d'activation est toujours KEYCODE_MEDIA_PLAY et ACTION_DOWN est immédiatement suivi de ACTION_UP. Ces problèmes ne surviennent que si nous sommes connectés via Bluetooth. Si nous sommes connectés via un casque à câble, nous obtenons les codes de clé appropriés (KEYCODE_HEADSETHOOK) et le temps d'indisponibilité n'est pas égal à 0.

  • Utiliser un BroadcastReceiver pour écouter les changements de connexion Bluetooth SCO. 

    private val scoReceiver = object : BroadcastReceiver() {
        fun onReceive(context: Context, intent: Intent) {
            val state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1)
            val previousState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, -1)
            if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED && previousState == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
                Log.e(TAG, "SCO Disconnected")
                hangupCall()
            }
        }
    }
    
    protected fun onStart() {
        super.onStart()
        val intentFilter = IntentFilter()
        intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)
        registerReceiver(scoReceiver, intentFilter)
    }
    

    Avec cette approche, je peux détecter le moment où l'utilisateur veut raccrocher, par exemple, appuyer longuement sur le casque Bluetooth car cela déclenche la déconnexion du SCO. 

    Problème: Impossible de détecter si l'utilisateur souhaite accepter un appel entrant.

  • Utiliser dispatchKeyEvent , onKeyDown et onKeyUp

    Problème: Ils ne sont jamais appelés du tout. 

Quelqu'un a-t-il des conseils ou une bonne pratique pour gérer correctement les casques Bluetooth? Toute aide est très appréciée. Merci d'avance!

12
Dariusch

Au cours d'un appel vocal normal et virtuel (y compris une sonnerie), tous les événements des boutons de l'unité de casque Bluetooth sont traités en interne par le service de casque Bluetooth et ne sont pas diffusés sous forme d'événements de bouton. Le service oreillette Bluetooth redirige ces événements vers le framework Telecom (answer/hangupCall).

2
hank15

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 si 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 transmis à 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.

1
RocketRandom