Verwalten von Anruf-Haltefunktionen

Das Vonage Client SDK verfügt über keine eigene „Hold“-API. Stattdessen Die Stummschaltung erfolgt durch eine Kombination aus Stummschaltung und Ohrenschützern:

  • mute(callId) — unterbricht die Audioübertragung an den Gesprächspartner
  • enableEarmuff(callId) — erhält keinen Ton mehr vom Gesprächspartner

An Freigeben, beides umkehren: Aufruf unmute(callId) und disableEarmuff(callId).

Unter iOS und Android bietet die Benutzeroberfläche für Systemanrufe (CallKit / Telecom-Framework) eine native Warteschleifentaste. Die folgenden Plattformanleitungen zeigen, wie diese Taste mit den Funktionen „Stummschalten“ und „Kopfhörer“ des SDK verknüpft wird.

Dieser Leitfaden führt Sie Schritt für Schritt durch den Prozess der Implementierung der Anruf-Haltefunktion in Ihren iOS- und Android-Applications mithilfe unseres VoIP-SDKs.

Die Anrufwarteschleife wird derzeit im Web-SDK nicht unterstützt.

Telekommunikationsintegration

Bevor Sie mit diesem Tutorial beginnen, stellen Sie bitte sicher, dass Sie das Android Telecom-Framework in Ihre Applications integriert haben.

Sie können der offiziellen Anleitung folgen hier oder probieren Sie unsere Android-App „Voice Sample“ aus, die hier verfügbar ist hier.

Unterstützung der Holding über die Implementierung der Verbindung

Sobald Sie Ihre Implementierung des Verbindung Klasse, du musst die CAPABILITY_SUPPORT_HOLD zu den Verbindungsfunktionen und überschreiben die onHold() und onUnhold() Methoden.

Nachfolgend finden Sie ein Beispiel in Kotlin:

class CallConnection(val callId: CallId) : Connection() {
    private lateinit var clientManager: VoiceClientManager
    var isOnHold = false
        private set

    init {
        connectionProperties = connectionProperties or PROPERTY_SELF_MANAGED
        connectionCapabilities = connectionCapabilities or CAPABILITY_SUPPORT_HOLD /** add other capabilities */
        audioModeIsVoip = true
    }

    // ... Other methods ...

    override fun onHold() {
        if (!isOnHold) {
            clientManager.holdCall(this)
        }
    }

    override fun onUnhold() {
        if (isOnHold) {
            clientManager.unholdCall(this)
        }
    }

    fun toggleHoldState() {
        isOnHold = !isOnHold
        if (isOnHold) setOnHold() else setActive()
    }
}

Interaktion mit dem Voice SDK

Um den Haltezustand für einen Anruf zu aktivieren, aktivieren Sie Stummschalten und Ohrenschützer gleichzeitig.

Der folgende Code innerhalb der VoiceClientManager Die Klasse veranschaulicht dies:

class VoiceClientManager(private val context: Context) {
    private lateinit var client : VoiceClient

    fun holdCall(call: CallConnection){
        call.apply{
            client.mute(callId){ error ->
                error?.let {
                    println("Error muting when holding call with id: $callId")
                } ?: run {
                    client.enableEarmuff(callId){ error ->
                        error?.let {
                            println("Error enabling earmuff when holding with id: $callId")
                        } ?: run {
                            println("Call $callId successfully put on hold")
                            toggleHoldState()
                        }
                    }
                }
            }
        }
    }

    fun unholdCall(call: CallConnection){
        call.apply{
            client.unmute(callId){ error ->
                error?.let {
                    println("Error unmuting when unholding call with id: $callId")
                } ?: run {
                    client.disableEarmuff(callId){ error ->
                        error?.let {
                            println("Error disabling earmuff unholding call with id: $callId")
                        } ?: run {
                            println("Call $callId successfully removed from hold")
                            toggleHoldState()
                        }
                    }
                }
            }
        }
    }
}

Sie können die Codeausschnitte gerne an Ihre spezifische Umsetzung und Ihre Anforderungen anpassen.

Callkit-Integration

Bevor Sie mit diesem Tutorial beginnen, stellen Sie bitte sicher, dass Sie das Callkit-Framework in Ihre Applications integriert haben.

Sie können dem offizieller Reiseführer, oder probieren Sie unsere iOS-App „Voice Sample“ aus, die hier verfügbar ist hier.

Support-Holding über CXUpdate

Sobald Sie Ihre CallController Klasse, die einen Verweis auf ein CXProvider und eine CXCallController Sie müssen die supportsHolding Flag auf dem CXCallUpdate sowohl für ausgehende als auch für eingehende Anrufe.

Nachfolgend finden Sie ein Beispiel in Swift:

import CallKit

class CallController {
    let callProvider: CXProvider
    let cxController = CXCallController()

    // ... Other methods ...

    func reportOutgoingCall(callId: String){
        self.callProvider.reportOutgoingCall(with: callId, connectedAt: Date.now)
        let update = CXCallUpdate()
        /** add other capabilities */
        update.supportsHolding = true
        self.callProvider.reportCall(with: callId, updated: update)
    }

    func reportIncomingCall(callId: String){
        let update = CXCallUpdate()
        /** add other capabilities */
        update.supportsHolding = true
        self.callProvider.reportNewIncomingCall(with: callId, update: update)
    }
}

Interaktion mit dem Voice SDK

Sobald Sie Ihre CXProviderDelegate Umsetzung, hören Sie sich das CXSetHeldCallAction Anrufe mithilfe des Voice SDK in die Warteschleife zu stellen.

Um den Haltezustand für einen Anruf zu aktivieren, aktivieren Sie Stummschalten und Ohrenschützer gleichzeitig.

Der folgende Code innerhalb der CallController Die Klasse veranschaulicht dies:

import VonageClientSDKVoice

class CallController: NSObject {
    let callProvider: CXProvider
    let cxController = CXCallController()
    let client: VGVoiceClient
    var activeCalls: [UUID: String] = [:] // Maps CallKit UUID to Vonage callId

    // ... initialization and other methods ...
}

extension CallController: CXProviderDelegate {

    func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
        guard let callId = self.activeCalls[action.callUUID] else {
            action.fail()
            return
        }
        if action.isOnHold {
            self.client.mute(callId) { error in
                if let error = error {
                    print("Error muting when holding call: \(error)")
                    return
                }
                self.client.enableEarmuff(callId) { error in
                    if let error = error {
                        print("Error enabling earmuff when holding call: \(error)")
                        return
                    }
                    print("Call \(callId) successfully put on hold")
                }
            }
        } else {
            self.client.unmute(callId) { error in
                if let error = error {
                    print("Error unmuting when unholding call: \(error)")
                    return
                }
                self.client.disableEarmuff(callId) { error in
                    if let error = error {
                        print("Error disabling earmuff when unholding call: \(error)")
                        return
                    }
                    print("Call \(callId) successfully removed from hold")
                }
            }
        }
        // CallKit requires fulfilling the action synchronously
        action.fulfill()
    }
}

Sie können die Codeausschnitte gerne an Ihre spezifische Umsetzung und Ihre Anforderungen anpassen.