Aplikacja do rozmów pozwala użytkownikom odbierać i nawiązywać połączenia audio i wideo na urządzenia. Aplikacje do wykonywania połączeń używają własnego interfejsu użytkownika do obsługi połączeń zamiast w domyślnym interfejsie aplikacji Telefon, jak widać na zrzucie ekranu poniżej.
Platforma Androida zawiera pakiet android.telecom
, który
zawiera klasy, które pomogą Ci utworzyć aplikację do rozmów (zgodnie z branżą telekomunikacyjną).
platformy. Tworzenie aplikacji zgodnie z platformą telekomunikacyjną zapewnia
następujące korzyści:
- Aplikacja współpracuje prawidłowo z natywnym podsystemem telekomunikacyjnym w urządzenia.
- Aplikacja poprawnie współpracuje z innymi aplikacjami do wykonywania połączeń, które również obsługują do tworzenia zasad Google.
- Ułatwia ona aplikacji zarządzanie routingiem audio i wideo.
- Platforma pomaga aplikacji określić, czy jej wywołania mają ukierunkować na działania.
Deklaracje i uprawnienia w pliku manifestu
W manifeście aplikacji zadeklaruj, że aplikacja używa atrybutu
MANAGE_OWN_CALLS
zgodnie z tym przykładem:
<manifest … >
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
</manifest>
Więcej informacji o deklarowaniu uprawnień aplikacji znajdziesz tutaj: Uprawnienia:
Musisz zadeklarować usługę, która określa klasę, która implementuje metodę
ConnectionService
zajęcia w aplikacji. Telekomunikacja
wymaga, aby usługa deklarowała uprawnienia BIND_TELECOM_CONNECTION_SERVICE
jako
tworzyć powiązania. Przykład poniżej pokazuje, jak zadeklarować usługę w
manifestu aplikacji:
<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>
Więcej informacji o deklarowaniu komponentów aplikacji, w tym usług, znajdziesz w artykule Komponenty aplikacji.
Wdróż usługę połączeń
Aplikacja do połączeń musi udostępniać implementację klasy ConnectionService
, z którą może powiązać podsystem telekomunikacyjny.
Implementacja ConnectionService
powinna zastąpić
następujące metody:
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
Podsystem telekomunikacyjny wywołuje tę metodę w odpowiedzi na Twoja aplikacja wywołuje
placeCall(Uri, Bundle)
, aby utworzyć nowe połączenie wychodzące. Aplikacja zwraca nowe wystąpienie implementacji klasyConnection
(więcej informacji znajdziesz w artykule Zaimplementuj połączenie), aby reprezentować nowy interfejs. połączenia wychodzącego. Możesz jeszcze bardziej dostosować połączenie wychodzące, wykonując następujące działania:- Aplikacja powinna wywoływać metodę
setConnectionProperties(int)
ze stałąPROPERTY_SELF_MANAGED
jako argumentem co wskazuje, że połączenie pochodzi z aplikacji do rozmów. - Jeśli Twoja aplikacja obsługuje zawieszanie połączeń, wywołaj metodę
setConnectionCapabilities(int)
i ustaw jako argument maski bitowej stałejCAPABILITY_HOLD
iCAPABILITY_SUPPORT_HOLD
. - Aby ustawić nazwę wywołującego, użyj metody
setCallerDisplayName(String, int)
z wynikiemPRESENTATION_ALLOWED
stała jako parametrint
, co wskazuje, że nazwa wywołującego które mają być wyświetlane. - Aby upewnić się, że połączenie wychodzące ma odpowiedni stan wideo, wywołaj metodę
metody
setVideoState(int)
obiektuConnection
i wyślij wartość zwrócona przez metodęgetVideoState()
metodyConnectionRequest
obiekt.
- Aplikacja powinna wywoływać metodę
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
Podsystem telekomunikacyjny wywołuje tę metodę, gdy aplikacja wywołuje metodę
placeCall(Uri, Bundle)
, a połączenie wychodzące nie może i reklamy. W związku z tą sytuacją aplikacja powinna informować użytkownika (na przykład np. za pomocą pola alertów lub komunikatu), że nie można umieszczonego tekstu. Aplikacja może nie być w stanie nawiązać połączenia, jeśli trwa jakieś połączenie alarmowe lub jeśli trwa połączenie w innej aplikacji, której nie można zawieszenia połączenia przed nawiązaniem połączenia.onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
Podsystem telekomunikacyjny wywołuje tę metodę, gdy aplikacja wywołuje metodę
addNewIncomingCall(PhoneAccountHandle, Bundle)
aby poinformować system o nowym połączeniu przychodzącym w aplikacji. Aplikacja zwraca błąd nowej instancji implementacjiConnection
(na przykład więcej informacji znajdziesz w artykule na temat implementowania połączenia). oznacza nowe połączenie przychodzące. Możesz dodatkowo dostosować wiadomości przychodzące przez wykonanie tych czynności:- Aplikacja powinna wywoływać metodę
setConnectionProperties(int)
ze stałąPROPERTY_SELF_MANAGED
jako argumentem co wskazuje, że połączenie pochodzi z aplikacji do rozmów. - Jeśli Twoja aplikacja obsługuje zawieszanie połączeń, wywołaj metodę
setConnectionCapabilities(int)
i ustaw jako argument maski bitowej stałejCAPABILITY_HOLD
iCAPABILITY_SUPPORT_HOLD
. - Aby ustawić nazwę wywołującego, użyj metody
setCallerDisplayName(String, int)
z wynikiemPRESENTATION_ALLOWED
stała jako parametrint
, co wskazuje, że nazwa wywołującego które mają być wyświetlane. - Aby podać numer telefonu lub adres połączenia przychodzącego, użyj funkcji
Metoda
setAddress(Uri, int)
obiektuConnection
. - Aby upewnić się, że połączenie wychodzące ma odpowiedni stan wideo, wywołaj metodę
metody
setVideoState(int)
obiektuConnection
i wyślij wartość zwrócona przez metodęgetVideoState()
metodyConnectionRequest
obiekt.
- Aplikacja powinna wywoływać metodę
onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
Podsystem telekomunikacyjny wywołuje tę metodę, gdy aplikacja wywołuje metodę
addNewIncomingCall(PhoneAccountHandle, Bundle)
, aby poinformować Telecom nowe połączenie przychodzące, ale połączenie przychodzące jest niedozwolone (aby więcej informacji znajdziesz w artykule o ograniczeniach dotyczących wywołań. Aplikacja powinna dyskretnie odrzucić połączenie przychodzące i (opcjonalnie) opublikować powiadomienie informujące, nazwa użytkownika nieodebranego połączenia.
Wdróż połączenie
Aplikacja powinna utworzyć podklasę Connection
do
reprezentują połączenia w Twojej aplikacji. Należy zastąpić następujące metody w
na potrzeby implementacji:
onShowIncomingCallUi()
Podsystem telekomunikacyjny wywołuje tę metodę, gdy dodajesz nowe połączenie przychodzące i Aplikacja powinna wyświetlać interfejs połączeń przychodzących.
onCallAudioStateChanged(CallAudioState)
Podsystem telekomunikacyjny wywołuje tę metodę, aby poinformować aplikację, że bieżący dźwięk Trasa lub tryb uległ zmianie. Ta funkcja jest wywoływana w odpowiedzi na zmianę przez aplikację tryb „Tylko dźwięk” za pomocą urządzenia
setAudioRoute(int)
. Metodę tę można też wywołać, jeśli system zmieni trasę audio. (na przykład po rozłączeniu zestawu słuchawkowego Bluetooth).onHold()
Podsystem telekomunikacyjny wywołuje tę metodę, gdy chce wstrzymać połączenie. W odpowiedzi na to żądanie aplikacja powinna wstrzymać wywołanie, a następnie wywołać Metoda
setOnHold()
informująca system że rozmowa jest wstrzymana. Podsystem telekomunikacyjny może wywoływać tę metodę, gdy usługa do obsługi połączeń (np. Android Auto) pokazuje, że połączenie chce przekazać użytkownikowi prośbę o zawieszenie połączenia. Podsystem telekomunikacyjny wywołuje również tej metody, jeśli użytkownik nawiązuje połączenie w innej aplikacji. Więcej informacje o usługach telefonicznych znajdziesz tutaj:InCallService
.onUnhold()
Podsystem telekomunikacyjny wywołuje tę metodę, gdy: chce wznowić zawieszone połączenie. Po wznowieniu aplikacji powinno ono wywołać metodę
setActive()
informuje system, że połączenie nie jest już wstrzymane. Telekomunikacja może wywołać tę metodę, gdy usługa odbierająca połączenia, taka jak Android Auto, który wyświetla Twoje połączenie, chce przekazać prośbę o jego wznowienie. Dla: więcej informacji o usługach połączeń telefonicznych znajdziesz tutaj:InCallService
.onAnswer()
Podsystem telekomunikacyjny wywołuje tę metodę, aby poinformować w aplikacji, że powinno zostać odebrane połączenie przychodzące. Gdy aplikacja odpowie powinno ono wywołać metodę
setActive()
informuje system, że połączenie zostało odebrane. Telekomunikacja może wywołać tę metodę, gdy aplikacja doda nowe połączenie przychodzące i W innej aplikacji trwa już połączenie, którego nie można zawiesić. Podsystem telekomunikacyjny wyświetla interfejs połączeń przychodzących w imieniu Twojej aplikacji tych instancji. Platforma udostępnia przeciążoną metodę, która zapewnia umożliwiają określanie stanu wideo, w którym chcesz odebrać połączenie. Więcej Więcej informacji:onAnswer(int)
.onReject()
Podsystem telekomunikacyjny wywołuje tę metodę, gdy chce odrzucić przychodzące . Gdy aplikacja odrzuci wywołanie, powinna wywołać metodę
setDisconnected(DisconnectCause)
i określićREJECTED
jako parametr. Aplikacja powinna a następnie wywołaj metodędestroy()
, aby poinformować system, w którym aplikacja przetworzyła połączenie. Wywołania podsystemu telekomunikacyjnego w przypadku, gdy użytkownik odrzucił połączenie przychodzące z aplikacji.onDisconnect()
Podsystem telekomunikacyjny wywołuje tę metodę, gdy chce zakończyć połączenie. Po zakończeniu połączenia aplikacja powinna wywołać metodę
setDisconnected(DisconnectCause)
i określićLOCAL
jako parametr, który wskazuje, że żądanie użytkownika spowodowało przerwanie połączenia. Aplikacja powinna następnie wywołać metodę Metodadestroy()
, która informuje dostawcę telekomunikacyjnego podsystemu, w którym aplikacja przetworzyła wywołanie. System może wywoływać tę metodę gdy użytkownik przerwie połączenie w innej usłudze, takiej jak Android Auto System wywołuje tę metodę także wtedy, gdy wywołanie musi być rozłączone, aby umożliwić nawiązywanie innych połączeń, np. gdy użytkownik chce aby wykonać połączenie alarmowe. Więcej informacji o usługach połączeń telefonicznych:InCallService
Obsługa typowych scenariuszy połączeń
Wykorzystanie interfejsu API ConnectionService
w wywołaniu
przepływ obejmuje interakcję z innymi klasami w android.telecom
pakietu SDK. W sekcjach poniżej znajdziesz opis typowych scenariuszy połączeń oraz sposób, w jaki
do obsługi tych aplikacji
powinny używać interfejsów API.
Odbieranie połączeń przychodzących
Sposób obsługi połączeń przychodzących zmienia się w zależności od tego, czy są połączenia w innych aplikacjach lub nie. Różnice w przepływie pracy wynika z tego, że platforma telekomunikacyjna musi wprowadzić pewne ograniczenia w przypadku aktywnych wywołań w innych aplikacjach, zapewnić stabilne środowisko dla wszystkich aplikacji do połączeń na urządzeniu. Więcej informacje znajdziesz w artykule Ograniczenia połączeń.
Brak aktywnych połączeń w innych aplikacjach
Aby odbierać połączenia przychodzące, gdy nie ma aktywnych połączeń w innych aplikacjach, postępuj zgodnie z wykonaj te czynności:
- Aplikacja odbiera nowe połączenie przychodzące za pomocą standardowych mechanizmów.
- Użyj metody
addNewIncomingCall(PhoneAccountHandle, Bundle)
do: komunikuje się podsystemem telekomunikacyjnym o nowym połączeniu przychodzącym. - Podsystem telekomunikacyjny wiąże się z implementacją
ConnectionService
Twojej aplikacji i wysyła żądanie nowej instancji klasyConnection
reprezentującej nowe przychodzące za pomocą metodyonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
. - Podsystem telekomunikacyjny informuje aplikację, że powinna wyświetlać połączenie przychodzące
za pomocą metody
onShowIncomingCallUi()
. - Aplikacja pokazuje przychodzący interfejs użytkownika za pomocą powiadomienia z powiązanym
intencję pełnoekranową. Więcej informacji:
onShowIncomingCallUi()
. - Wywołaj metodę
setActive()
, jeśli użytkownik akceptuje połączenie przychodzące lubsetDisconnected(DisconnectCause)
z parametremREJECTED
, po którym następuje znak do metodydestroy()
, jeśli użytkownik odrzuca połączenie przychodzące.
Aktywne połączenia w innych aplikacjach, których nie można zawiesić
Aby odbierać połączenia przychodzące, gdy są aktywne połączenia w innych aplikacjach, które nie mogą aby zawiesić konto, wykonaj te czynności:
- Aplikacja odbiera nowe połączenie przychodzące za pomocą standardowych mechanizmów.
- Użyj metody
addNewIncomingCall(PhoneAccountHandle, Bundle)
do: komunikuje się podsystemem telekomunikacyjnym o nowym połączeniu przychodzącym. - Podsystem telekomunikacyjny wiąże się z implementacją
ConnectionService
Twojej aplikacji i wysyła żądanie nowej instancji obiektuConnection
reprezentującego nowy obiekt połączenie przychodzące za pomocą metodyonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
. - Podsystem telekomunikacyjny wyświetla interfejs dla połączeń przychodzących dla połączeń przychodzących.
- Jeśli użytkownik zaakceptuje połączenie, podsystem telekomunikacyjny wywołuje metodę
onAnswer()
. Należy wywołać metodęsetActive()
, aby wskazać operatorowi telekomunikacyjnego podsystemu, w którym połączenie zostało połączone. - Jeśli użytkownik odrzuci połączenie, podsystem telekomunikacyjny wywołuje metodę
onReject()
. Należy wywołać metodęsetDisconnected(DisconnectCause)
z parametremREJECTED
, po którym następuje znak do metodydestroy()
.
Nawiązuj połączenia wychodzące
Proces nawiązywania połączeń wychodzących obejmuje obsługę możliwości, nie można nawiązać połączenia z powodu ograniczeń nałożonych przez platformę telekomunikacyjną. Więcej informacji znajdziesz w artykule Ograniczenia połączeń.
Aby nawiązać połączenie wychodzące, wykonaj te czynności:
- Użytkownik nawiązuje połączenie wychodzące w aplikacji.
- Użyj metody
placeCall(Uri, Bundle)
, aby poinformować podsystemem telekomunikacyjnym dotyczącym nowego połączenia wychodzącego. Wykonaj te czynności parametry metody:- Parametr
Uri
reprezentuje adres, pod którym . W przypadku zwykłych numerów telefonów użyj identyfikatora URItel:
oszustw. - Parametr
Bundle
umożliwia podanie informacji o aplikacji do wykonywania połączeń – dodaj do elementuEXTRA_PHONE_ACCOUNT_HANDLE
obiektPhoneAccountHandle
swojej aplikacji. Twoje aplikacja musi dostarczać obiektPhoneAccountHandle
w przypadku każdego wywołania wychodzącego. - Parametr
Bundle
pozwala też określić, czy połączenie wychodzące obejmuje wideo przez określenie wartościSTATE_BIDIRECTIONAL
w dodatkowym ustawieniuEXTRA_START_CALL_WITH_VIDEO_STATE
. Pamiętaj, że domyślnie podsystem telekomunikacyjny kieruje połączenia wideo do głośnika.
- Parametr
- Podsystem telekomunikacyjny łączy się z podsystemem
ConnectionService
aplikacji implementacji. - Jeśli aplikacja nie może nawiązać połączenia wychodzącego, podsystem telekomunikacyjny
metody
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
do informuje aplikację, że nie można nawiązać połączenia w bieżącej godzinie. Twoja aplikacja powinien informować użytkownika, że nie można nawiązać połączenia. - Jeśli aplikacja może nawiązywać połączenia wychodzące, podsystem telekomunikacyjny może nawiązywać połączenia
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
. Aplikacja powinna zwrócić instancję klasyConnection
, aby reprezentować nowe połączenie wychodzące. Dla: o właściwościach, które należy ustawić w połączeniu, Więcej informacji znajdziesz w artykule o implementowaniu usługi połączeń. - Po nawiązaniu połączenia wychodzącego wywołaj metodę
setActive()
, aby poinformować podsystem telekomunikacyjny że jest ono aktywne.
Kończenie połączenia
Aby zakończyć połączenie, wykonaj te czynności:
- Wywołaj funkcję
setDisconnected(DisconnectCause)
wysyłającąLOCAL
jako parametr, jeśli użytkownik zakończył(a) połączenie lub wyślijREMOTE
jako parametru, jeśli druga strona zakończyła połączenie. - Wywołaj metodę
destroy()
.
Ograniczenia połączeń
Aby zapewnić użytkownikom spójną i prostą obsługę połączeń, firma telekomunikacyjna
narzuca pewne ograniczenia dotyczące zarządzania wywołaniami na urządzeniu. Dla:
użytkownik zainstalował dwie aplikacje do połączeń, które wykorzystują
samodzielnie zarządzany interfejs API ConnectionService
, FooTalk i
BarTalk. W takim przypadku obowiązują te ograniczenia:
Na urządzeniach z interfejsem API poziomu 27 lub niższym tylko jedna aplikacja może obsługiwać trwającego połączenia w dowolnym momencie. To ograniczenie oznacza, że chociaż użytkownik ma trwającego połączenia za pomocą aplikacji FooTalk, aplikacja BarTalk nie może rozpocząć ani odebrać połączenia na nowe połączenie.
Na urządzeniach korzystających z interfejsu API poziomu 28 lub nowszego, jeśli obie te funkcje działają zarówno w FooTalk, jak i BarTalk zadeklaruj
CAPABILITY_SUPPORT_HOLD
orazCAPABILITY_HOLD
uprawnień, użytkownik może prowadzić więcej niż jedno trwające wywołanie do przełączać się między aplikacjami, aby nawiązać lub odebrać kolejne połączenie.Jeśli użytkownik bierze udział w zwykłych zarządzanych wywołaniach (np. za pomocą funkcji wbudowanej aplikacji Telefon lub Telefon), użytkownik nie może nawiązywać połączeń pochodzących z do rozmów. Oznacza to, że jeśli użytkownik bierze udział w zwykłej rozmowie przy użyciu operatora komórkowego, nie mogą oni jednocześnie uczestniczyć w połączeniu FooTalk ani BarTalk.
Podsystem telekomunikacyjny rozłączy połączenia w aplikacji, jeśli użytkownik wybierze numer połączenie alarmowe.
Aplikacja nie może odbierać ani nawiązywać połączeń, gdy użytkownik ma połączenie alarmowe.
Jeśli trwa połączenie w innej aplikacji do połączeń, gdy Twoja aplikacja przyjdzie połączenie przychodzące, odebranie połączenia spowoduje zakończenie wszystkich trwających połączeń w innej aplikacji. Aplikacja nie powinna wyświetlać swojego zwykłego interfejsu połączeń przychodzących. Platforma telekomunikacyjna wyświetla interfejs użytkownika połączeń przychodzących i informuje, użytkownik, który odbierze nowe połączenie, zakończy trwające połączenia. Ten oznacza, że użytkownik bierze udział w rozmowie w FooTalk, a aplikacja BarTalk odbierze połączenie przychodzące, platforma telekomunikacyjna informuje użytkownika, że połączenia przychodzącego BarTalk, odebranie połączenia spowoduje zakończenie Rozmowa FooTalk.