Kotlin

Anrufe verwalten

Anruf entgegennehmen

Zwei neue Eigenschaften hinzufügen onGoingCallID um das aktuelle Live-Gespräch zu halten und callInviteID um eine Einladung für einen eingehenden Anruf oben auf dem Bildschirm zu halten. MainActivity Klasse:

private var onGoingCallID: CallId? = null
private var callInviteID: CallId? = null

Um auf eingehende Anrufe zu achten, fügen Sie call invite listener am Ende von onCreate innere Methode MainActivity Klasse:

client.setCallInviteListener { callId, from, channelType ->
  callInviteID = callId
  runOnUiThread {
    answerCallButton.visibility = View.VISIBLE
    rejectCallButton.visibility = View.VISIBLE
    endCallButton.visibility = View.GONE
  }
}

Die App wartet nun auf das Ereignis eines eingehenden Anrufs. Der obige Code zeigt die Schaltflächen zum Annehmen und Ablehnen eines Anrufs, wenn das Ereignis "Eingehender Anruf" empfangen wird. Beachten Sie, dass Sie Folgendes speichern callInviteID Referenz, um später mit dem Anruf zu interagieren.

Als Nächstes fügen Sie unter dem Hörer für die Anrufeinladung den Hörer für das Auflegen bei RTC hinzu, der sich darum kümmert, wenn der Anrufer auflegt und der Anruf beendet wird.

client.setOnCallHangupListener { callId, callQuality, isRemote ->
  onGoingCallID = null
  answerCallButton.visibility = View.GONE
  rejectCallButton.visibility = View.GONE
  endCallButton.visibility = View.GONE
}

Bevor Sie Aktionen über die Benutzeroberfläche ausführen können, müssen Sie den Schaltflächen Hörer hinzufügen. Fügen Sie diesen Code in der onCreate innerhalb MainActivity Klasse:

answerCallButton.setOnClickListener { answerCall() }
rejectCallButton.setOnClickListener { rejectCall() }
endCallButton.setOnClickListener { endCall() }

Um den Anruf entgegenzunehmen, fügen Sie answerCall innere Methode MainActivity Klasse:

@SuppressLint("MissingPermission")
private fun answerCall() {
  callInviteID?.let {
    client.answer(it) {
      err ->
      when {
        err != null -> {
          connectionStatusTextView.text = err.localizedMessage
        }
        else -> {
          onGoingCallID = it
          answerCallButton.visibility = View.GONE
          rejectCallButton.visibility = View.GONE
          endCallButton.visibility = View.VISIBLE
        }
      }
    }
  }
}

Nach Beantwortung des Anrufs wird die end call wird angezeigt.

HINWEIS: Die SuppressLint Anmerkung wird der Einfachheit halber verwendet. In der Produktionsanwendung sollten Sie sicherstellen, dass die Berechtigungen gewährt werden, bevor Sie den Anruf beantworten.

Zum Abweisen des Anrufs fügen Sie rejectCall innere Methode MainActivity Klasse:

private fun rejectCall() {
    callInviteID?.let {
      client.reject(it) { err ->
        when {
          err != null -> {
            connectionStatusTextView.text = err.localizedMessage
          }
          else -> {
            answerCallButton.visibility = View.GONE
            rejectCallButton.visibility = View.GONE
            endCallButton.visibility = View.GONE
          }
        }
      }
    onGoingCallID = null
  }
}

Um den Anruf zu beenden, fügen Sie endCall innere Methode MainActivity Klasse:

private fun endCall() {
  onGoingCallID?.let {
    client.hangup(it) {
      err ->
      when {
        err != null -> {
          connectionStatusTextView.text = err.localizedMessage
        }
        else -> {
          answerCallButton.visibility = View.GONE
          rejectCallButton.visibility = View.GONE
          endCallButton.visibility = View.GONE
        }
      }
    }
  }
  onGoingCallID = null
}

Beachten Sie, dass Sie nach erfolgreichem Ablehnen oder Beenden des Anrufs die call Eigenschaftswert auf Null zurück.

Bauen und Ausführen

Stellen Sie sicher, dass der Webhook-Server, den Sie in den vorherigen Schritten erstellt haben, noch läuft.

Drücken Sie die Ctrl + R Tasten zum Erstellen und Ausführen der App. Rufen Sie die Nummer an.

Rufen Sie die Nummer an, die mit Ihrem Antrag aus dem vorherigen Schritt verknüpft ist.

Webhaken

Während Sie den Anruf tätigen, wechseln Sie bitte zum Terminal und beachten Sie die /voice/answer Endpunkt, der zum Abrufen des NCCO aufgerufen wird:

NCCO request: - caller: 447700900000 - callee: 442038297050

Außerdem durchläuft der Anruf verschiedene Phasen, /voice/event werden Ereignisse gesendet:

EVENT:
{
  headers: {},
  from: '447700900000',
  to: '442038297050',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'ringing',
  direction: 'inbound',
  timestamp: '2021-03-29T21:20:05.582Z'
}
---
EVENT:
{
  headers: {},
  from: '447700900000',
  to: '442038297050',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'started',
  direction: 'inbound',
  timestamp: '2021-03-29T21:20:05.582Z'
}
---
EVENT:
{
  start_time: null,
  headers: {},
  rate: null,
  from: '447700900000',
  to: '442038297050',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'answered',
  direction: 'inbound',
  network: null,
  timestamp: '2021-03-29T21:20:06.182Z'
}
---
EVENT:
{
  from: '447700900000',
  to: 'Alice',
  uuid: '944bf4bf-8dc7-4e23-86b2-2f4234777416',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'started',
  direction: 'outbound',
  timestamp: '2021-03-29T21:20:13.025Z'
}
---
EVENT:
{
  start_time: null,
  headers: {},
  rate: null,
  from: '447700900000',
  to: 'Alice',
  uuid: '944bf4bf-8dc7-4e23-86b2-2f4234777416',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'answered',
  direction: 'outbound',
  network: null,
  timestamp: '2021-03-29T21:20:13.025Z'
}
---
EVENT:
{
  headers: {},
  end_time: '2021-03-29T21:20:16.000Z',
  uuid: '944bf4bf-8dc7-4e23-86b2-2f4234777416',
  network: null,
  duration: '5',
  start_time: '2021-03-29T21:20:11.000Z',
  rate: '0.00',
  price: '0',
  from: '447700900000',
  to: 'Alice',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'completed',
  direction: 'outbound',
  timestamp: '2021-03-29T21:20:17.574Z'
}
---
EVENT:
{
  headers: {},
  end_time: '2021-03-29T21:20:18.000Z',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  network: 'GB-FIXED',
  duration: '12',
  start_time: '2021-03-29T21:20:06.000Z',
  rate: '0.00720000',
  price: '0.00144000',
  from: ' 447700900000',
  to: '442038297050',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'completed',
  direction: 'inbound',
  timestamp: '2021-03-29T21:20:17.514Z'
}
---