VoIP-Anwendungen können ihre Anrufe in die Systemanrufliste einbinden. So können Nutzer ihre VoIP-Anrufliste zentral in der System-Wähl-App einsehen und Anrufe direkt über die Wähl-App zurückrufen. In diesem Leitfaden werden die erforderlichen Änderungen an VoIP-Anruf-Apps, System-Wähl-Apps und Einstellungen für den einheitlichen Anrufverlauf beschrieben.
Änderungen für die Anruf-App
So integrieren Sie Ihre VoIP-App in das Systemanrufprotokoll:
Rückruf-Intent-Filter registrieren
Registrieren Sie die systemgeschützte Intention 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, um später einen Callback an Ihre App zu senden, wenn ein Nutzer einen VoIP-Anruflisten-Logeintrag in der Telefon-App auswählt, um den Anruf zurückzugeben.
<!-- 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 Callback 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
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) ) ) }
Anrufliste überprüfen
Das Systemanruflog enthält eine begrenzte Anzahl von Einträgen und löscht schließlich alte Anrufaufzeichnungen. Da in der App eine Zuordnung von UUIDs zu Anrufdetails für die Callback-Verarbeitung gespeichert wird, sollte sie regelmäßig prüfen, welche UUIDs noch im Systemanruflog 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 der Speicher optimieren.
Verwenden Sie CallLog.Calls.CONTENT_VOIP_URI, um die aktuelle Liste der UUIDs abzurufen, die der App im Systemlog zugewiesen sind.
Ä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:
Hängen Sie unter Android 16.1 (API‑Level 36.1) den Abfrageparameter
include_voip_callsan den ContentanbieterCallLog.Callsan, um VoIP-Anruflisten anzuzeigen:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
Unter Android 17 (API-Level 37) und höher verwenden Sie den folgenden formalisierten Contentanbieter und Parameterschlüssel:
Rückrufe über die Telefon App starten
Verwenden Sie TelecomManager.placeCall, um einen Callback über ein Wählprogramm zu starten. Die Plattform verwendet die eindeutige CallLog.Calls._ID des Anruflogeintrags, 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)
Einstellungen für die einheitliche Anrufliste verwalten
Ab Android 17 (API-Level 37) können Nutzer den einheitlichen Anrufverlauf in den Systemeinstellungen (in der Regel unter Einstellungen > Anrufkonten > Integrierte Anruflisten oder direkt in der Standard-Wähl-App) pro App ansehen und ein- oder ausschalten. Sowohl Drittanbieter-Anruf-Apps als auch Dialer-Apps können auf diese Einstellungen zugreifen.
Nutzer zu den Einstellungen leiten
Wenn Sie die Einstellungen für die einheitliche Anrufliste öffnen möchten, starten Sie eine Activity mit der Intent-Aktion TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION:
val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION) startActivity(intent)
Wenn ein Nutzer das einheitliche Anrufprotokoll für eine App in den Systemeinstellungen deaktiviert, werden alle vorhandenen Anrufprotokolleinträge für dieses Paket sofort und dauerhaft aus dem nativen Anrufprotokollanbieter (CallLog.Calls) gelöscht. Zukünftige Anrufe, die von dieser App initiiert oder für diese App empfangen werden, werden nicht im System-Dialer aufgezeichnet.
Auf Änderungen der Einstellungen reagieren
Damit die Synchronisierung erhalten bleibt, wenn ein Nutzer die einheitliche Anrufliste für Ihre Anruf-App in den Systemeinstellungen oder im Telefon aktiviert oder deaktiviert, registrieren Sie einen Übertragungsempfänger für die Broadcast-Intent TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE (android.telecom.action.VOIP_CALL_LOG_PREFERENCE):
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 den Schalter umlegt, sendet die Plattform diese Absicht mit dem aktualisierten booleschen Status im Extra TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS an Ihre App. Anstatt auf die regelmäßige Bestätigung durch CallLog.Calls zu warten, kann Ihre App auf diesen Broadcast hören. Wenn die einheitliche Anrufliste deaktiviert ist (also auf false festgelegt ist), kann Ihre App ihren internen Status aktualisieren oder Bereinigungen durchführen, z. B. lokal zwischengespeicherte Anrufzuordnungen löschen, die für die Callback-Verarbeitung verwendet werden.