Einheitliche Anrufliste

VoIP-Anwendungen können ihre Anrufe in die Systemanrufliste einbinden. So können Nutzer ihre VoIP-Anrufliste zentral in der System-Telefon-App sehen und Anrufe direkt über die Telefon-App zurückrufen. In dieser Anleitung werden die erforderlichen Änderungen an VoIP-Telefon-Apps, System-Telefon-Apps und den Einstellungen für den einheitlichen Anrufverlauf beschrieben.

Änderungen für die Anruf-App

So binden Sie Ihre VoIP-App in die Systemanrufliste ein:

Intent-Filter für Rückruf registrieren

Registrieren Sie den systemgeschützten Intent TelecomManager.ACTION_CALL_BACK.

Sobald dieser Intent-Filter ordnungsgemäß 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, um später einen Rückruf an Ihre App zu senden, wenn ein Nutzer in der Telefon-App einen VoIP-Anruflisteneintrag auswählt, um den Anruf zurückzurufen.

<!-- 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 in der System-Telefon-App protokolliert. Wenn Sie Anrufe einzeln ausschließen möchten, setzen Sie den isLogExcluded booleschen Wert auf true in CallAttributesCompat.

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
        ),
)

Rückrufe verarbeiten

Anrufe, die über CallsManager.addCall hinzugefügt werden, 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)
        )
    )
}

Anruflisteneinträge überprüfen

Die Systemanrufliste enthält eine begrenzte Anzahl von Einträgen und löscht schließlich alte Anrufdatensätze. Da die App eine Zuordnung von UUIDs zu Anrufdetails für die Rückrufverarbeitung speichert, sollte sie regelmäßig prüfen, welche UUIDs noch in der Systemanrufliste vorhanden sind. Wenn eine 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 Speicherplatz optimieren.

Die aktuelle Liste der UUIDs, die der App im System log zugeordnet sind, erhalten Sie mit CallLog.Calls.CONTENT_VOIP_URI.

Änderungen für die Telefon-App

So aktivieren Sie die Telefon-App, um VoIP-Anruflisten anzuzeigen und Rückrufe an VoIP-Apps zu initiieren:

VoIP-Anruflisten in der Telefon-App anzeigen

Standardmäßig werden VoIP-Anruflisten nicht in der Telefon-App angezeigt. So zeigen Sie die integrierten Anruflisten in der Telefon-App an:

Rückrufe über die Telefon-App initiieren

Verwenden Sie TelecomManager.placeCall, um einen Rückruf über die Telefon-App zu initiieren. Die Plattform verwendet die eindeutige CallLog.Calls._ID des Anruflisten-Logeintrags, um die richtige VoIP-App zu starten. Dieser Start umfasst einen TelecomManager.ACTION_CALL_BACK-Intent, eine vom System definierte Aktion zum Initiieren eines Rückrufs. Dieser Intent 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)

Einstellungen für die einheitliche Anrufliste verwalten

Ab Android 17 (API-Level 37) können Nutzer den einheitlichen Anrufverlauf in den Systemeinstellungen für jede App einzeln ansehen und aktivieren oder deaktivieren (in der Regel unter Einstellungen > Anrufkonten > Integrierte Anruflisten oder direkt in der Standard-Telefon-App). Sowohl Telefon-Apps von Drittanbietern als auch Telefon-Apps können mit diesen Einstellungen interagieren.

Starten Sie eine Aktivität mit der TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION Intent-Aktion, um die Einstellungen für die einheitliche Anrufliste zu öffnen:

val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION)
startActivity(intent)

Wenn ein Nutzer den einheitlichen Anrufverlauf für eine App in den Systemeinstellungen deaktiviert, löscht das System sofort und dauerhaft alle vorhandenen Anruflisteneinträge für dieses Paket aus dem nativen Anruflistenanbieter (CallLog.Calls). Zukünftige Anrufe, die von dieser App initiiert oder für sie empfangen werden, werden nicht in der System-Telefon-App aufgezeichnet.

Auf Änderungen der Einstellungen achten

Wenn ein Nutzer den einheitlichen Anrufverlauf für Ihre Telefon-App in den Systemeinstellungen oder der Telefon-App aktiviert oder deaktiviert, registrieren Sie einen Broadcast-Empfänger für den TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE (android.telecom.action.VOIP_CALL_LOG_PREFERENCE) Broadcast-Intent, um die Synchronisierung aufrechtzuerhalten:

val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE) {
            // Status of the Unified Call History of the app
            val isEnabled = intent.getBooleanExtra(
                TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS,
                true
            )
        }
    }
}

Wenn der Nutzer die Einstellung ändert, sendet die Plattform diesen Intent mit dem aktualisierten booleschen Status im TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS Extra an Ihre App. Anstatt auf die regelmäßige Überprüfung mit CallLog.Calls zu warten, kann Ihre App auf diesen Broadcast achten. Wenn die einheitliche Anrufliste deaktiviert ist (also auf false gesetzt ist), kann Ihre App ihren internen Status aktualisieren oder Bereinigungen durchführen, z. B. lokal im Cache gespeicherte Anrufzuordnungen löschen, die für die Rückrufverarbeitung verwendet werden.