Mit einer Anruf-App können Nutzer Audio- und Videoanrufe auf ihrem Gerät . Anruf-Apps nutzen für Anrufe ihre eigene Benutzeroberfläche Standardoberfläche der Telefon App, wie im folgenden Screenshot dargestellt.
Das Android-Framework enthält das Paket android.telecom
, das
enthält Klassen, die Ihnen dabei helfen, eine Anruf-App für den
Framework. Wenn Sie Ihre App nach dem Telekommunikations-Framework entwickeln,
die folgenden Vorteile:
- Ihre App funktioniert ordnungsgemäß mit dem nativen Telekommunikationssubsystem im .
- Ihre App funktioniert ordnungsgemäß mit anderen Anruf-Apps, die ebenfalls die des Frameworks.
- Das Framework unterstützt Ihre App bei der Verwaltung von Audio- und Videorouting.
- Mithilfe des Frameworks kann Ihre App feststellen, ob die Aufrufe im Mittelpunkt stehen.
Manifestdeklarationen und Berechtigungen
Deklariere in deinem App-Manifest, dass deine App die
MANAGE_OWN_CALLS
wie im folgenden Beispiel gezeigt:
<manifest … >
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
</manifest>
Weitere Informationen zum Deklarieren von App-Berechtigungen findest du unter Berechtigungen:
Sie müssen einen Dienst deklarieren, der die Klasse angibt, die das Tag
ConnectionService
Kurs in deiner App. Telekommunikation
Subsystem erfordert, dass der Dienst die Berechtigung BIND_TELECOM_CONNECTION_SERVICE
für
sich daran binden. Das folgende Beispiel zeigt, wie der Dienst in
App-Manifest ein:
<service android:name="com.example.MyConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
Weitere Informationen zum Deklarieren von App-Komponenten, einschließlich Diensten, finden Sie unter App-Komponenten:
Verbindungsdienst implementieren
Die aufrufende App muss eine Implementierung der ConnectionService
-Klasse enthalten, an die das Telekommunikationssubsystem gebunden werden kann.
Ihre ConnectionService
-Implementierung sollte
die folgenden Methoden verwenden:
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
Das Telekommunikationssubsystem ruft diese Methode als Reaktion auf Deine App ruft
placeCall(Uri, Bundle)
auf , um einen neuen ausgehenden Anruf zu erstellen. Ihre App gibt eine neue Instanz derConnection
-Klassenimplementierung zurück. Weitere Informationen finden Sie unter Implementieren Sie die Verbindung), um die neue ausgehender Anruf. Sie können die ausgehende Verbindung weiter anpassen, indem Sie die folgenden Aktionen ausführen:- Ihre App sollte die Methode
setConnectionProperties(int)
mit der KonstantePROPERTY_SELF_MANAGED
als Argument aufrufen. um anzuzeigen, dass die Verbindung von einer aufrufenden App stammt. - Wenn Ihre App das Halten von Anrufen unterstützt, rufen Sie die Methode
setConnectionCapabilities(int)
auf und legen Sie Argument in den Bitmaskenwert der KonstantenCAPABILITY_HOLD
undCAPABILITY_SUPPORT_HOLD
. - Verwenden Sie die Methode
setCallerDisplayName(String, int)
, um den Namen des Aufrufers festzulegen. Übergeben derPRESENTATION_ALLOWED
Konstante alsint
-Parameter, um anzugeben, dass der Name des Aufrufers auf angezeigt werden. - Um sicherzustellen, dass der ausgehende Anruf den richtigen Videostatus hat, rufe die
setVideoState(int)
desConnection
-Objekts und senden den vomgetVideoState()
-Methode desConnectionRequest
-Objekt.
- Ihre App sollte die Methode
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
Das Telekommunikationssubsystem ruft diese Methode auf, wenn Ihre App die Methode
placeCall(Uri, Bundle)
aufruft und der ausgehende Anruf nicht platziert werden. Als Reaktion auf diese Situation sollte Ihre App den Nutzer (für z. B. durch ein Benachrichtigungsfeld oder einen Toast), dass der ausgehende Anruf nicht platziert. Deine App kann möglicherweise keinen Anruf starten, wenn ein Anruf aktiv ist oder wenn ein Anruf in einer anderen App aktiv ist, bevor du einen Anruf tätigst.onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
Das Telekommunikationssubsystem ruft diese Methode auf, wenn Ihre App die Methode
addNewIncomingCall(PhoneAccountHandle, Bundle)
aufruft. um das System über einen neuen eingehenden Anruf in deiner App zu informieren. Ihre App gibt eine neue Instanz derConnection
-Implementierung (für Weitere Informationen finden Sie unter Verbindung implementieren.) für den neuen eingehenden Anruf. Sie können eingehende Anfragen Verbindung herstellen, indem Sie die folgenden Aktionen ausführen:- Ihre App sollte die Methode
setConnectionProperties(int)
mit der KonstantePROPERTY_SELF_MANAGED
als Argument aufrufen. um anzuzeigen, dass die Verbindung von einer aufrufenden App stammt. - Wenn Ihre App das Halten von Anrufen unterstützt, rufen Sie die Methode
setConnectionCapabilities(int)
auf und legen Sie Argument in den Bitmaskenwert der KonstantenCAPABILITY_HOLD
undCAPABILITY_SUPPORT_HOLD
. - Verwenden Sie die Methode
setCallerDisplayName(String, int)
, um den Namen des Aufrufers festzulegen. Übergeben derPRESENTATION_ALLOWED
Konstante alsint
-Parameter, um anzugeben, dass der Name des Aufrufers auf angezeigt werden. - Um die Telefonnummer oder Adresse für den eingehenden Anruf anzugeben, verwenden Sie die
setAddress(Uri, int)
-Methode desConnection
-Objekts. - Um sicherzustellen, dass der ausgehende Anruf den richtigen Videostatus hat, rufe die
setVideoState(int)
desConnection
-Objekts und senden den vomgetVideoState()
-Methode desConnectionRequest
-Objekt.
- Ihre App sollte die Methode
onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
Das Telekommunikationssubsystem ruft diese Methode auf, wenn Ihre App die Methode
addNewIncomingCall(PhoneAccountHandle, Bundle)
aufruft, um die Telekommunikation über eingehenden Anruf an, der eingehende Anruf ist jedoch nicht erlaubt (weitere finden Sie unter Einschränkungen aufrufen. Ihre App sollte Eingehenden Anruf lautlos ablehnen und optional eine Benachrichtigung den Nutzer des verpassten Anrufs.
Verbindung implementieren
Ihre Anwendung sollte eine abgeleitete Klasse von Connection
erstellen, um
die Anrufe in Ihrer App darstellen. Sie sollten die folgenden Methoden in
Ihre Implementierung:
onShowIncomingCallUi()
Das Telekommunikationssubsystem ruft diese Methode auf, wenn Sie einen neuen eingehenden Anruf hinzufügen und sollte die Benutzeroberfläche für eingehende Anrufe angezeigt werden.
onCallAudioStateChanged(CallAudioState)
Das Telekommunikationssubsystem ruft diese Methode auf, um Ihrer App mitzuteilen, die Route oder den Modus geändert hat. Dieser wird aufgerufen, wenn Ihre App die Audiomodus mit der
setAudioRoute(int)
. Diese Methode kann auch aufgerufen werden, wenn das System die Audioroute ändert. z. B. wenn die Verbindung zu einem Bluetooth-Headset getrennt wird.onHold()
Das Telekommunikationssubsystem ruft diese Methode auf, wenn ein Anruf gehalten werden soll. Als Antwort auf diese Anfrage sollte Ihre App den Aufruf halten und dann die Methode
setOnHold()
-Methode, um das System zu informieren dass der Anruf gehalten wird. Das Telekommunikationssubsystem kann diese Methode aufrufen, ein laufender Dienst wie Android Auto, der anzeigt, dass Ihr Anruf eine Nutzeranfrage weiterleiten, um den Anruf zu halten. Das Telekommunikationssubsystem wenn der Nutzer einen Aufruf in einer anderen App aktiviert. Weitere Informationen Informationen zu Diensten während eines Anrufs finden Sie unterInCallService
.onUnhold()
Das Telekommunikationssubsystem ruft diese Methode auf, Ein gehaltener Anruf wird fortgesetzt. Sobald Ihre App fortgesetzt wird des Aufrufs sollte die
setActive()
aufgerufen werden. , um dem System mitzuteilen, dass der Anruf nicht mehr gehalten wird. Telekommunikation kann diese Methode aufgerufen werden, wenn ein Anrufdienst wie Android Auto wird angezeigt, dass Ihr Anruf eine Anfrage zum Fortsetzen des Anrufs weiterleiten möchte. Für Weitere Informationen zu Diensten während eines Anrufs finden Sie unterInCallService
.onAnswer()
Das Telekommunikationssubsystem ruft diese Methode auf, App, dass ein eingehender Anruf angenommen wird. Sobald Ihre App eine Antwort des Aufrufs sollte die
setActive()
aufgerufen werden. , um dem System mitzuteilen, dass der Anruf angenommen wurde. Telekommunikation kann diese Methode vom Subsystem aufgerufen werden, wenn Ihre App einen neuen eingehenden Anruf hinzufügt Es gibt bereits einen Anruf in einer anderen App, der nicht gehalten werden kann. Das Telekommunikationssubsystem zeigt die UI für eingehende Anrufe im Namen Ihrer App in diese Instanzen. Das Framework bietet eine überlastete Methode, -Unterstützung, um den Videostatus anzugeben, in dem der Anruf entgegengenommen werden soll. Weitere Informationen finden Sie unteronAnswer(int)
.onReject()
Das Telekommunikationssubsystem ruft diese Methode auf, wenn ein aufrufen. Sobald deine App den Aufruf abgelehnt hat, sollte sie
setDisconnected(DisconnectCause)
aufrufen undREJECTED
als Parameter angeben. Ihre App sollte Rufen Sie dann die Methodedestroy()
auf, System, dass die App den Anruf verarbeitet hat. Das Telekommunikationssubsystem ruft wenn der Nutzer einen eingehenden Anruf von Ihrer App abgelehnt hat.onDisconnect()
Das Telekommunikationssubsystem ruft diese Methode auf, wenn es einen Anruf trennen möchte. Nach Beendigung des Aufrufs sollte Ihre App die Methode
setDisconnected(DisconnectCause)
aufrufen undLOCAL
als Parameter angeben, um anzugeben, dass ein Nutzeranfrage hat dazu geführt, dass der Anruf unterbrochen wurde. Ihre App sollte dann die Methodedestroy()
-Methode zur Information der Telekommunikationsbranche Subsystem, in dem die App den Aufruf verarbeitet hat. Das System kann diese Methode aufrufen, Der Nutzer hat einen Anruf über einen anderen während des Anrufs getätigten Dienst getrennt, z. B. Android Auto Das System ruft diese Methode auch auf, wenn Ihr Aufruf getrennt, damit andere Anrufe getätigt werden können, z. B. wenn der Nutzer um einen Notruf abzusetzen. Weitere Informationen zu Diensten während eines Anrufs finden Sie unterInCallService
Häufige Anrufszenarien bewältigen
ConnectionService
API in Ihrem Aufruf verwenden
umfasst die Interaktion mit den anderen Klassen im android.telecom
Paket. In den folgenden Abschnitten werden gängige Anrufszenarien beschrieben und Sie erfahren,
App sollte die APIs für ihre Verarbeitung verwenden.
Eingehende Anrufe annehmen
Der Ablauf zur Verarbeitung eingehender Anrufe ändert, ob Anrufe in anderen Apps eingehen oder nicht. Der Grund für die unterschiedlichen Abläufe ist, dass das Telekommunikations-Framework müssen einige Einschränkungen festgelegt werden, wenn es in anderen Apps aktive Aufrufe für um eine stabile Umgebung für alle Anruf-Apps auf dem Gerät zu gewährleisten. Weitere Informationen Weitere Informationen finden Sie unter Aufrufeinschränkungen.
Keine aktiven Anrufe in anderen Apps
Um eingehende Anrufe anzunehmen, wenn keine Anrufe in anderen Apps aktiv sind, folge diese Schritte:
- Ihre App empfängt einen neuen eingehenden Anruf wie gewohnt.
- Verwenden Sie die Methode
addNewIncomingCall(PhoneAccountHandle, Bundle)
, um das Telekommunikationssubsystem über den neuen eingehenden Anruf zu informieren. - Das Telekommunikations-Subsystem wird an die
ConnectionService
-Implementierung Ihrer Anwendung gebunden und fordert eine neue Instanz an der KlasseConnection
, die die neuen eingehenden mit der MethodeonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
aufrufen. - Das Subsystem des Telekommunikationsanbieters informiert Ihre App darüber, dass eingehende Anrufe angezeigt werden sollen
mithilfe der Methode
onShowIncomingCallUi()
. - Ihre App zeigt die eingehende UI in Form einer Benachrichtigung mit einem zugehörigen
Full-Screen Intent. Weitere Informationen findest du unter
onShowIncomingCallUi()
. - Rufen Sie die Methode
setActive()
auf, wenn der Nutzer akzeptiert den eingehenden Anruf odersetDisconnected(DisconnectCause)
und gibtREJECTED
als Parameter an, gefolgt von einem die Methodedestroy()
aufrufen, wenn der Nutzer lehnt den eingehenden Anruf ab.
Aktive Anrufe in anderen Apps, die nicht gehalten werden können
Zum Annehmen eingehender Anrufe, wenn in anderen Apps aktive Anrufe eingehen, die das nicht können auf „Hold“ gesetzt werden, gehen Sie so vor:
- Ihre App empfängt einen neuen eingehenden Anruf wie gewohnt.
- Verwenden Sie die Methode
addNewIncomingCall(PhoneAccountHandle, Bundle)
, um das Telekommunikationssubsystem über den neuen eingehenden Anruf zu informieren. - Das Telekommunikations-Subsystem wird an die
ConnectionService
-Implementierung Ihrer Anwendung gebunden und fordert eine neue Instanz an desConnection
-Objekts, das das neue einen eingehenden Anruf mit der MethodeonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
an. - Das Subsystem des Telekommunikationsanbieters zeigt die Benutzeroberfläche für eingehende Anrufe an.
- Wenn der Nutzer den Anruf annimmt, ruft das Telekommunikationssubsystem die Methode
onAnswer()
auf. Sie sollten die MethodesetActive()
aufrufen, um dem Telekommunikationsunternehmen mitzuteilen, Subsystem, mit dem der Anruf jetzt verbunden ist. - Wenn der Nutzer den Anruf ablehnt, ruft das Telekommunikationssubsystem die Methode
onReject()
auf. Rufen Sie die MethodesetDisconnected(DisconnectCause)
auf und geben SieREJECTED
als Parameter an, gefolgt von einem die Methodedestroy()
aufrufen.
Ausgehende Anrufe tätigen
Beim Tätigen eines ausgehenden Anrufs muss die Möglichkeit berücksichtigt werden, kann aufgrund von Einschränkungen durch das Telekommunikations-Framework nicht getätigt werden. Weitere Informationen finden Sie unter Aufrufeinschränkungen.
So tätigen Sie einen Anruf:
- Der Nutzer initiiert in Ihrer App einen ausgehenden Anruf.
- Verwenden Sie die Methode
placeCall(Uri, Bundle)
, um den Subsystem des Telekommunikationsanbieters über den neuen ausgehenden Anruf. Nehmen Sie Folgendes: Überlegungen zu den Methodenparametern: <ph type="x-smartling-placeholder">- </ph>
- Der Parameter
Uri
steht für die Adresse, an der der an den der Anruf erfolgt. Verwenden Sie für normale Telefonnummern den URItel:
. . - Mit dem Parameter
Bundle
können Sie Informationen zu deiner aufrufenden App, indem du dasPhoneAccountHandle
-Objekt deiner App zumEXTRA_PHONE_ACCOUNT_HANDLE
-Extra hinzufügst. Ihr Die App muss für jeden ausgehenden Anruf dasPhoneAccountHandle
-Objekt bereitstellen. - Mit dem Parameter
Bundle
können Sie auch festlegen, Der ausgehende Anruf enthält Video, indem der WertSTATE_BIDIRECTIONAL
in der zusätzlichenEXTRA_START_CALL_WITH_VIDEO_STATE
angegeben wird. Beachten Sie, dass das Telekommunikationssubsystem Videoanrufe standardmäßig an den Freisprechfunktion.
- Der Parameter
- Das Subsystem des Telekommunikationsanbieters wird an die
ConnectionService
Ihrer App gebunden Implementierung. - Wenn Ihre App keine ausgehenden Anrufe ermöglicht, ruft das Subsystem des Telekommunikationsanbieters
die Methode
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
, um Informieren Sie die App darüber, dass der Anruf zum aktuellen Zeitpunkt nicht möglich ist. Ihre App sollte den Nutzer darüber informieren, dass der Anruf nicht getätigt werden kann. - Wenn deine App in der Lage ist, ausgehende Anrufe zu tätigen, ruft das Subsystem des Telekommunikationsanbieters
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
. Ihre App sollte eine Instanz IhrerConnection
-Klasse zurückgeben, die den neuen ausgehenden Anruf darstellt. Für weitere Informationen zu den Eigenschaften, die Sie in der Verbindung festlegen sollten, Siehe Verbindungsdienst implementieren. - Wenn der ausgehende Anruf verbunden ist, rufen Sie die Methode
setActive()
auf, um das Subsystem des Telekommunikationsanbieters zu informieren dass der Anruf aktiv ist.
Anruf beenden
So beenden Sie einen Anruf:
- Rufen Sie
setDisconnected(DisconnectCause)
auf, dasLOCAL
als Parameter sendet, wenn der Nutzer beendet den Anruf oder sendeREMOTE
als Parameter verwenden, wenn die andere Partei den Aufruf beendet hat. - Rufen Sie die Methode
destroy()
auf.
Aufrufeinschränkungen
Um den Nutzern eine einheitliche und einfache Anruferfahrung zu bieten,
-Framework erzwingt einige Einschränkungen für die Anrufverwaltung auf dem Gerät. Für
Angenommen, der Nutzer hat zwei aufrufende Apps installiert,
die selbstverwaltete ConnectionService
API, FooTalk und
BarTalk: In diesem Fall gelten die folgenden Einschränkungen:
Auf Geräten mit API-Level 27 oder niedriger kann nur eine App laufenden Anrufs zu einem bestimmten Zeitpunkt. Diese Einschränkung bedeutet, dass ein Nutzer aktuellen Anruf über die FooTalk-App nicht aktiv ist, kann die BarTalk-App keinen einen neuen Anruf starten.
Auf Geräten mit API-Level 28 oder höher, wenn sowohl FooTalk als auch BarTalk deklarieren
CAPABILITY_SUPPORT_HOLD
undCAPABILITY_HOLD
hat, kann der Nutzer mehrere aktive Anrufe um zwischen den Apps zu wechseln, um einen weiteren Anruf zu starten oder anzunehmen.Wenn der Nutzer regelmäßig verwaltete Aufrufe durchführt (z. B. die Verwendung des integrierten Telefon- oder Telefon-App), kann der Nutzer nicht an Anrufen teilnehmen, die von für Anrufe von Apps. Wenn ein Nutzer also an einem normalen Anruf teilnimmt und Mobilfunkanbieter verwenden, können sie nicht gleichzeitig an einem FooTalk- oder BarTalk-Anruf teilnehmen.
Das Telekommunikationssubsystem trennt die Anrufe Ihrer App, wenn der Nutzer eine Notruf.
Ihre App kann keine Anrufe empfangen oder tätigen, während sich der Nutzer in einem Notruf befindet.
Wenn in einer anderen App ein Anruf eingeht, wenn Ihre App einen Anruf empfängt einen eingehenden Anruf annehmen, werden alle laufenden Anrufe im in einer anderen App. Ihre App sollte nicht die normale Benutzeroberfläche für eingehende Anrufe anzeigen. Das Telekommunikations-Framework zeigt die Benutzeroberfläche für eingehende Anrufe an und informiert Der Nutzer, der den neuen Anruf annimmt, beendet seinen aktuellen Anruf bzw. seine laufenden Anrufe. Dieses Wenn der Nutzer an einem FooTalk-Anruf teilnimmt und die BarTalk-App eine einen eingehenden Anruf an, informiert das Telekommunikations-Framework den Nutzer, dass er eingehenden BarTalk-Anrufs an und durch den Annehmen des BarTalk-Anrufs wird die FooTalk-Anruf.