it-swarm.com.de

Annehmen eines Anrufs über ein Bluetooth-Headset VoIP

Ich arbeite an einer VoIP-Android-App und die App muss in der Lage sein, Bluetooth-Headset anzunehmen oder abzulehnen. 

Das Problem ist jedoch, dass nach dem Hinzufügen der Verbindung zu SCO 

    audioManager.startBluetoothSco()
    audioManager.isBluetoothScoOn = true

Sobald ich auf die Headset-Taste klicke, kann ich einen Ton hören, der normalerweise auftritt, wenn ich einen Anruf per Telefon akzeptiere. Daher gehe ich davon aus, dass einige Android-Systemkomponenten dieses Signal fangen und es nicht weiter werfen

Was ich schon probiert habe:

1) Telephony State Listener (Es ist immer IDLE) 

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

2) MediaSession + Silent Noise + Listener für Medienschaltflächen Funktioniert nicht beim ersten Klick, beim zweiten Klick werden die Klicks korrekt behandelt 

3) MEDIA_BUTTON-Empfänger funktioniert nicht

Ich habe eine ähnliche Frage in SO gefunden, aber ohne die Antwort, wie sie funktioniert Annehmen eines Anrufs über ein Bluetooth-Headset

Gibt es überhaupt einen Weg, wie ich das Klicken der Bluetooth-Taste vom Bluetooth-Headset-Dienst abfangen kann? 

16

Einen Anruf über ein Bluetooth-Headset annehmen

Füge meine Antwort von dort auch hier hinzu.

Diese Ereignisse werden intern in HeadsetStateMachine (unter Pakete/Apps/Bluetooth) behandelt.

Diese Ereignisse werden an die IBluetoothHeadsetPhone-Schnittstelle weitergeleitet. Die einzelne Anwendung, an die alle Ereignisse weitergeleitet werden, wird zur Laufzeit durch den folgenden Bindungscode in HeadsetStateMachine.Java definiert. Dies ermöglicht es Telefonherstellern, sie an eine benutzerdefinierte Telefonanwendung anstatt an die Standardanwendung weiterzuleiten, wenn die Standardanwendung nicht verwendet wird.

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");
    }

Damit die Ereignisse anstelle der Standard-Telefonanwendung an Ihre Anwendung weitergeleitet werden, müssen Sie einen Zugangscode ändern. Sie müssen die Ereignisse an einem HeadsetStateMachine-, BluetoothHeadsetPhone-Proxy oder der Telefonanwendung abfangen.

Leider ist das, wonach Sie suchen, derzeit nicht möglich, ohne den Code zu ändern. Einige Headsets wie Plantronics verfügen über benutzerdefinierte BT-Ereignisse, die an alle Anwendungen weitergeleitet werden. Einige der vorhandenen VoIP-Anwendungen unterstützen diese benutzerdefinierten Absichten, um die Anrufbeantwortung einiger Headsets zu unterstützen.

0
RocketRandom