Einheitliche Anrufliste

VoIP-Anwendungen können ihre Anrufe in die Systemanrufliste einbinden. So können Nutzer ihre VoIP-Anrufliste zentral in der System-Dialer-App einsehen und Anrufe direkt über die Dialer-App zurückrufen. In diesem Leitfaden werden die erforderlichen Änderungen an VoIP-Anruf-Apps und System-Dialer-Apps beschrieben.

Änderungen für die Anruf-App

So integrieren Sie Ihre VoIP-App in die Systemanrufliste:

Callback-Intent-Filter registrieren

Registrieren Sie die systemgeschützte Intent TelecomManager.ACTION_CALL_BACK.

Sobald dieser Intent-Filter richtig registriert ist, werden alle Anrufe, die Ihre App mit CallsManager.addCall oder anderen zugehörigen Telecom-APIs hinzufügt, automatisch vom System protokolliert. Das System verwendet diesen registrierten Intent später, um einen Callback an Ihre App zu senden, wenn ein Nutzer einen VoIP-Anruflisten-Logeintrag in der Wählhilfe auswählt, um den Anruf zu erwidern.

<!-- Activity to handle the callback intent from the system dialer -->
<activity
    android:name=".VoipCallActivity"
    android:exported="true">

    <!-- Register callback intent -->
    <intent-filter>
        <action android:name="android.telecom.action.CALL_BACK" />
    </intent-filter>
</activity>

Anrufprotokollierung ausschließen

Sobald der Rückruf registriert ist, werden alle Anrufe im System-Dialer protokolliert. Wenn Sie Anrufe einzeln ausschließen möchten, legen Sie den booleschen Wert isLogExcluded in CallAttributesCompat auf true fest.

CallAttributesCompat(
    displayName = displayName,
    address = address,
    isLogExcluded = excludeCallLogging, // to exclude call from logging
    direction = if (isIncoming) {
        CallAttributesCompat.DIRECTION_INCOMING
    } else {
        CallAttributesCompat.DIRECTION_OUTGOING
    },
    callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL,
    callCapabilities = (
        CallAttributesCompat.SUPPORTS_SET_INACTIVE
            or CallAttributesCompat.SUPPORTS_STREAM
            or CallAttributesCompat.SUPPORTS_TRANSFER
        ),
)

Callbacks verarbeiten

Über CallsManager.addCall hinzugefügte Anrufe erhalten über CallControlScope.getCallId eine eindeutige UUID.

// check the intent action for CALL_BACK
if (intent.action == TelecomManager.ACTION_CALL_BACK) {
    launchCall(
        // fetching stored call details for the UUID to initiate callback
        callDetails = getCallDetails(
            uuid = intent.getStringExtra(TelecomManager.EXTRA_UUID)
        )
    )
}

Anrufliste prüfen

Im Systemanruflog wird eine begrenzte Anzahl von Einträgen gespeichert. Alte Anrufaufzeichnungen werden schließlich gelöscht. Da die App eine Zuordnung von UUID zu Anrufdetails für die Callback-Verarbeitung speichert, sollte sie regelmäßig prüfen, welche UUID noch im Systemanrufprotokoll vorhanden sind. Wenn ein UUID nicht mehr im Systemlog vorhanden ist, kann der Nutzer keinen Rückruf für diesen Anruf initiieren und die App kann die Zuordnung sicher aus dem lokalen Speicher entfernen. So lässt sich der Speicher optimieren.

Wenn Sie die aktuelle Liste der UUIDs abrufen möchten, die der App im Systemprotokoll zugeordnet sind, verwenden Sie CallLog.Calls.CONTENT_VOIP_URI.

Änderungen an der Telefon App

So aktivieren Sie die Dialer App, damit VoIP-Anruflisten angezeigt und Rückrufe an VoIP-Apps gestartet werden können:

VoIP-Anruflisten in der Telefon-App anzeigen

Standardmäßig werden Anruflisten von VoIP-Apps nicht in der Telefon-App angezeigt. So blenden Sie die integrierten Anruflisten in der Telefon-App ein:

Rückrufe über die Telefon App starten

Verwenden Sie TelecomManager.placeCall, um einen Rückruf über eine Wählhilfe zu starten. Die Plattform verwendet die eindeutige CallLog.Calls._ID des Anrufliste-Eintrags, um die richtige VoIP-App zu starten. Dieser Start umfasst einen TelecomManager.ACTION_CALL_BACK-Intent, eine vom System definierte Aktion zum Starten eines Rückrufs. Diese Absicht enthält die UUID des Anrufs im Intent-Extra TelecomManager.EXTRA_UUID, sodass die VoIP-App erkennen kann, welcher Anruf zurückgerufen wird.

// Uri generated with unique ID of the call log entry to launch the respective VoIP app for callback
val address = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId)

// extra information required to initiate callback
val extras = Bundle()

telecomManager.placeCall(address, extras)