Utwórz aplikację do rozmów

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.

Przykład aplikacji do rozmów,
Przykład aplikacji do rozmów korzystającej z własnego interfejsu

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 klasy Connection (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:

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 implementacji Connection (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:

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ę Metoda destroy(), 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:

  1. Aplikacja odbiera nowe połączenie przychodzące za pomocą standardowych mechanizmów.
  2. Użyj metody addNewIncomingCall(PhoneAccountHandle, Bundle) do: komunikuje się podsystemem telekomunikacyjnym o nowym połączeniu przychodzącym.
  3. Podsystem telekomunikacyjny wiąże się z implementacją ConnectionService Twojej aplikacji i wysyła żądanie nowej instancji klasy Connection reprezentującej nowe przychodzące za pomocą metody onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest).
  4. Podsystem telekomunikacyjny informuje aplikację, że powinna wyświetlać połączenie przychodzące za pomocą metody onShowIncomingCallUi().
  5. Aplikacja pokazuje przychodzący interfejs użytkownika za pomocą powiadomienia z powiązanym intencję pełnoekranową. Więcej informacji: onShowIncomingCallUi().
  6. Wywołaj metodę setActive(), jeśli użytkownik akceptuje połączenie przychodzące lub setDisconnected(DisconnectCause) z parametrem REJECTED, po którym następuje znak do metody destroy(), 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:

  1. Aplikacja odbiera nowe połączenie przychodzące za pomocą standardowych mechanizmów.
  2. Użyj metody addNewIncomingCall(PhoneAccountHandle, Bundle) do: komunikuje się podsystemem telekomunikacyjnym o nowym połączeniu przychodzącym.
  3. Podsystem telekomunikacyjny wiąże się z implementacją ConnectionService Twojej aplikacji i wysyła żądanie nowej instancji obiektu Connection reprezentującego nowy obiekt połączenie przychodzące za pomocą metody onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest).
  4. Podsystem telekomunikacyjny wyświetla interfejs dla połączeń przychodzących dla połączeń przychodzących.
  5. 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.
  6. Jeśli użytkownik odrzuci połączenie, podsystem telekomunikacyjny wywołuje metodę onReject(). Należy wywołać metodę setDisconnected(DisconnectCause) z parametrem REJECTED, po którym następuje znak do metody destroy().

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:

  1. Użytkownik nawiązuje połączenie wychodzące w aplikacji.
  2. 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 URI tel: oszustw.
    • Parametr Bundle umożliwia podanie informacji o aplikacji do wykonywania połączeń – dodaj do elementu EXTRA_PHONE_ACCOUNT_HANDLE obiekt PhoneAccountHandle swojej aplikacji. Twoje aplikacja musi dostarczać obiekt PhoneAccountHandle 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ści STATE_BIDIRECTIONAL w dodatkowym ustawieniu EXTRA_START_CALL_WITH_VIDEO_STATE. Pamiętaj, że domyślnie podsystem telekomunikacyjny kieruje połączenia wideo do głośnika.
  3. Podsystem telekomunikacyjny łączy się z podsystemem ConnectionService aplikacji implementacji.
  4. 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.
  5. 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ę klasy Connection, 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ń.
  6. 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:

  1. Wywołaj funkcję setDisconnected(DisconnectCause) wysyłającą LOCAL jako parametr, jeśli użytkownik zakończył(a) połączenie lub wyślij REMOTE jako parametru, jeśli druga strona zakończyła połączenie.
  2. 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 oraz CAPABILITY_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.