Unterstützung für Anruf-Apps von Drittanbietern

Android 9 bietet APIs, um Anruf-Apps von Drittanbietern besser zu unterstützen. Anruf-Apps von Drittanbietern verwenden in der Regel Telefonie-APIs wie die PHONE_STATE-Broadcast, um neben Anrufen über den Mobilfunkanbieter zu funktionieren. Daher müssen Anruf-Apps von Drittanbietern Anrufen über den Mobilfunkanbieter Priorität einräumen und eingehende Anrufe in der App oft stumm ablehnen oder einen laufenden Anruf beenden, um Platz für einen Anruf über den Mobilfunkanbieter zu schaffen.

Die APIs in Android 9 unterstützen gleichzeitige Anrufszenarien zwischen Apps von Drittanbietern und Anrufen über den Mobilfunkanbieter. So ist es beispielsweise möglich, einen eingehenden Anruf von einem Drittanbieter zu empfangen, während Sie gerade einen Anruf über den Mobilfunkanbieter führen. Das Framework sorgt dafür, dass der Anruf über den Mobilfunkanbieter gehalten wird, wenn der Nutzer den Anruf von einem Drittanbieter annimmt.

In Android 9 sollten Anruf-Apps von Drittanbietern die selbstverwaltete ConnectionService-Klasse implementieren. Weitere Informationen zum Erstellen einer Anruf-App mit dieser Klasse finden Sie unter Anruf-App mit der Core-Telecom Bibliothek erstellen.

Die selbstverwaltete ConnectionService Klasse bietet Entwicklern auch die Möglichkeit, Anrufe in ihrer App im Systemanrufprotokoll zu protokollieren (siehe EXTRA_LOG_SELF_MANAGED_CALLS). Gemäß den Anforderungen im Android Compatibility Definition Document (CDD) (Abschnitt 7.4.1.2) müssen Sie dafür sorgen, dass in Ihrer Dialer- oder Telefon-App diese Anrufprotokolleinträge angezeigt werden und der Name der Anruf-App des Drittanbieters, von der der Anruf stammt, zu sehen ist. Ein Beispiel dafür, wie die AOSP-Dialer-App diese Anforderung erfüllt, finden Sie unter Anrufprotokolleinträge von Anruf-Apps von Drittanbietern.

Apps sind dafür verantwortlich, CAPABILITY_SUPPORT_HOLD und CAPABILITY_HOLD für die Verbindungen ihrer Apps festzulegen. Es ist jedoch möglich, dass eine App unter bestimmten Umständen einen Anruf nicht halten kann. Das Framework enthält Bestimmungen zur Lösung dieser Fälle.

Szenarien

Sie sollten Ihre Dialer-App so ändern, dass sie die folgenden Szenarien verarbeiten kann.

Eingehende Anrufe verarbeiten, die einen laufenden Anruf beenden

In einem Szenario, in dem ein laufender Anruf von einem Drittanbieter (z. B. ein SuperCaller-Anruf) geführt wird, der das Halten von Anrufen nicht unterstützt, und der Nutzer einen Mobilanruf erhält (z. B. über seinen Mobilfunkanbieter FooCom), sollte Ihre Dialer- oder Telefon-App dem Nutzer mitteilen, dass durch die Annahme des Mobilanrufs der laufende Anruf von einem Drittanbieter beendet wird.

Diese Nutzererfahrung ist wichtig, da bei einer Anruf-App von einem Drittanbieter möglicherweise ein laufender Anruf geführt wird, der vom Framework nicht gehalten werden kann. Wenn ein neuer Mobilanruf angenommen wird, wird der laufende Anruf von einem Drittanbieter beendet.

Ein Beispiel für die Benutzeroberfläche finden Sie in der Abbildung:

Eingehender Anruf unterbricht laufenden Drittanbieteranruf

Abbildung 1 : Eingehender Anruf beendet einen laufenden Anruf von einem Drittanbieter.

Ihre Dialer-App kann prüfen, ob ein eingehender Anruf dazu führt, dass ein anderer Anruf be endet wird. Dazu müssen Sie die Anruf-Extras prüfen. Achten Sie darauf, dass EXTRA_ANSWERING_DROPS_FG_CALL auf TRUE und EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME auf den Namen der App festgelegt ist, deren Anruf beendet wird, wenn der eingehende Mobilanruf angenommen wird.

Anrufprotokolleinträge von Anruf-Apps von Drittanbietern

Entwickler von Anruf-Apps von Drittanbietern können Anrufe in ihrer App im Systemanrufprotokoll protokollieren (siehe EXTRA_LOG_SELF_MANAGED_CALLS). Das bedeutet, dass es Einträge im Anrufprotokoll geben kann, die nicht für Mobilanrufe gelten.

Wenn in der AOSP-Dialer-App Anrufprotokolleinträge angezeigt werden, die sich auf eine Anruf-App von einem Drittanbieter beziehen, wird der Name der App, in der der Anruf geführt wurde, im Anrufprotokoll angezeigt, wie in der Abbildung dargestellt:

Logeintrag der Anrufliste mit Anruf-App eines Drittanbieters

Abbildung 2 : Logeintrag für Anrufe mit dem Namen der Anruf-App von einem Drittanbieter in der Telefon-App.

Verwenden Sie die PHONE_ACCOUNT_COMPONENT_NAME und PHONE_ACCOUNT_ID Spalten im Anrufprotokollanbieter, um den Namen einer App zu ermitteln, die mit einem Anrufprotokolleintrag verknüpft ist. Erstellen Sie dazu eine Instanz von PhoneAccountHandle, die die Quelle eines Anrufprotokolleintrags identifiziert. Fragen Sie TelecomManager ab, um die Details für die PhoneAccount Klasse zu erhalten. Prüfen Sie die PhoneAccount Funktionen, um festzustellen, ob ein Anrufprotokoll-Logeintrag von einer Anruf-App von einem Drittanbieter stammt. Sehen Sie dazu nach, ob CAPABILITY_SELF_MANAGED festgelegt ist.

Die getLabel Methode des zurückgegebenen PhoneAccount gibt den Namen der App zurück, die mit einem Anrufprotokoll-Logeintrag aus der Anruf-App von einem Drittanbieter verknüpft ist.

Steuerelemente für die VoIP-Anrufprotokollintegration

Ab Android 17 (API-Level 37) können VoIP-Anruf-Apps von Drittanbietern, die in Core-Telecom und CallsManager integriert sind, ihren Anrufverlauf direkt in das native Android-Systemanrufprotokoll (CallLog.Calls) schreiben.

Um einen einheitlichen Datenschutz (für Nutzer) und eine einheitliche Datenbereinigung im gesamten Android-Ökosystem zu gewährleisten, müssen alle Geräte mit Android 17 (API-Level 37) und höher, die das Telekommunikations Funktions-Flag (android.software.telecom) deklarieren und die android.app.role.DIALER Rolle haben, gemäß dem Android Compatibility Definition Document (CDD) Steuerelemente für die VoIP-Anruflisteintegration pro App unterstützen.

Anforderungen an die Geräteimplementierung

Geräte müssen einen für Nutzer zugänglichen Bildschirm Einstellungen bieten (in der Regel unter Einstellungen > Anrufkonten > Integrierte Anrufprotokolle). Dort können Nutzer die Anrufprotokollintegration für einzelne VoIP-Apps von Drittanbietern ansehen und aktivieren oder deaktivieren.

Um diese Anforderung zu erfüllen, müssen Sie die Standardeinstellung der Plattform integrieren:

  • Integration der Plattformeinstellungen:Achten Sie darauf, dass Ihr Gerät com.android.phone.settings.PhoneAccountSettingsActivity enthält, das von der Android-Plattform standardmäßig bereitgestellt wird (com.android.phone).
  • Anforderung zur Intent-Auflösung:Ihr Gerät muss den Intent TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) auf den Bildschirm für die Standardplattformverwaltung auflösen.

Wenn eine App, eine Systemaufforderung oder ein Deeplink Folgendes aufruft, muss der Intent PhoneAccountSettingsActivity erfolgreich starten und darf keine ActivityNotFoundException auslösen:

Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);

Validierung

Verwenden Sie die Telecomm-Test-App, um zu testen, ob Ihr Gerät Anruf-Apps von Drittanbietern unterstützt. Die App implementiert die selbstverwaltete ConnectionService-Klasse. Die App befindet sich unter /packages/services/Telecomm/testapps/.

  1. Erstellen Sie die Test-App im Stammverzeichnis Ihres Android-Quell-Repositorys mit folgendem Befehl:

    mmma packages/services/Telecomm/testapps/

  2. Installieren Sie die erstellte APK-Datei mit adb install -g -r <apk path>. Ihrem Launcher wird dann ein Symbol für eine selbstverwaltete Beispiel-App hinzugefügt.

  3. Tippen Sie auf das Symbol, um die Test-App zu öffnen.

Eingehende Anrufe verarbeiten, die einen laufenden Anruf beenden

Führen Sie die folgenden Schritte aus, um zu prüfen, ob ein eingehender Anruf einen laufenden Anruf von einem Drittanbieter beendet.

App für Anruf-Apps von Drittanbietern testen

Abbildung 3 : Test-App mit Beispielimplementierungen der ConnectionService-Klasse.

  1. Deaktivieren Sie die Option Holdable.
  2. Tippen Sie auf OUTGOING , um einen neuen ausgehenden Beispielanruf zu starten.
  3. Tippen Sie auf die Schaltfläche ACTIVE , um den Anruf zu aktivieren.
  4. Rufen Sie die Telefonnummer des zu testenden Geräts mit einem anderen Telefon an. Dadurch wird das Szenario aufgerufen, in dem Ihre Dialer-App den Namen einer App erhält, deren Anruf beendet wird.
  5. Wenn Sie fertig sind, tippen Sie in der Test-App auf die Schaltfläche DISCONNECT.

Anrufprotokolleinträge von Anruf-Apps von Drittanbietern

Nachdem Sie die oben genannten Schritte ausgeführt haben, sollte die Test-App einen Anruf im Systemanrufprotokoll protokolliert haben. Öffnen Sie Ihre Dialer-App und prüfen Sie, ob der Anruf im Systemanrufprotokoll angezeigt wird, um zu bestätigen, dass das Gerät Anrufe von Anruf-Apps von Drittanbietern protokolliert.

Steuerelemente für die VoIP-Anrufprotokollintegration

Führen Sie den CtsTelecomTestCases-Test der Compatibility Test Suite (CTS) aus, um die Einhaltung der Anforderung für den Intent zur VoIP-Anrufprotokollintegration unter Android 17 und höher zu prüfen. Dieser Test prüft über Paketgrenzen hinweg, ob das Senden von TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) auf dem Gerät zu einem gültigen exportierten Aktivitätshandler aufgelöst wird (resolveActivity-Prüfung).