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:
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()
Verwenden Sie unter Android 17 (API-Level 37) und höher den folgenden formalisierten Contentanbieter und Parameterschlüssel:
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.
Nutzer zu den Einstellungen weiterleiten
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.