Obsługa aplikacji do połączeń innych firm

Android 9 udostępnia interfejsy API, które lepiej obsługują aplikacje do połączeń innych firm. Aplikacje do połączeń innych firm zwykle korzystają z interfejsów Telephony API, takich jak transmisja PHONE_STATE, aby współistnieć z połączeniami telefonicznymi operatora. W rezultacie aplikacje do połączeń innych firm muszą traktować połączenia operatora priorytetowo i często odrzucają połączenia przychodzące w aplikacji lub kończą trwające połączenie, aby zrobić miejsce na połączenie operatora.

Interfejsy API w Androidzie 9 obsługują scenariusze równoczesnych połączeń między aplikacjami innych firm a połączeniami operatora. Umożliwia to na przykład odbieranie połączeń przychodzących z aplikacji innych firm podczas rozmowy z operatorem. Framework przejmuje odpowiedzialność za zawieszenie połączenia operatora, gdy użytkownik odbierze połączenie z aplikacji innej firmy.

W Androidzie 9 zachęcamy aplikacje do połączeń innych firm do implementowania klasy ConnectionService zarządzanej samodzielnie. Więcej informacji o tym, jak utworzyć aplikację do połączeń za pomocą tej klasy, znajdziesz w artykule Tworzenie aplikacji do połączeń za pomocą biblioteki Core-Telecom library.

Klasa zarządzana samodzielnie ConnectionService daje też deweloperom możliwość włączenia rejestrowania połączeń w ich aplikacji w systemowym rejestrze połączeń (patrz EXTRA_LOG_SELF_MANAGED_CALLS). Zgodnie z wymaganiami w dokumencie dokument definicji zgodności Android (CDD) (sekcja 7.4.1.2) musisz zadbać o to, aby aplikacja do obsługi połączeń lub aplikacja Telefon wyświetlała te wpisy w rejestrze połączeń oraz nazwę aplikacji do połączeń innej firmy, z której pochodziło połączenie (przykład tego, jak aplikacja do obsługi połączeń AOSP spełnia to wymaganie, znajdziesz w sekcji Wpisy w rejestrze połączeń z aplikacji do połączeń innych firm).

Aplikacje są odpowiedzialne za ustawianie CAPABILITY_SUPPORT_HOLD i CAPABILITY_HOLD w połączeniach swoich aplikacji. Może się jednak zdarzyć, że w pewnych okolicznościach aplikacja nie będzie mogła zawiesić połączenia. Framework zawiera rozwiązania umożliwiające rozwiązywanie tego typu problemów.

Scenariusze

Musisz zmodyfikować aplikację do obsługi połączeń, aby obsługiwała te scenariusze.

Obsługa połączeń przychodzących, które rozłączają trwające połączenie

W sytuacji, gdy trwa połączenie z aplikacji innej firmy (np.w aplikacji SuperCaller), które nie obsługuje zawieszania, a użytkownik odbiera połączenie komórkowe (np. za pomocą operatora FooCom), aplikacja do obsługi połączeń lub aplikacja Telefon powinna poinformować użytkownika, że odebranie połączenia w sieci komórkowej spowoduje zakończenie trwającego połączenia z aplikacji innej firmy.

To ważne, ponieważ aplikacja do połączeń innej firmy może mieć trwające połączenie, którego framework nie może zawiesić. Odebranie nowego połączenia komórkowego powoduje rozłączenie trwającego połączenia z aplikacji innej firmy.

Przykład interfejsu użytkownika znajdziesz na ilustracji:

Połączenie przychodzące przerywa trwające połączenie z aplikacji innej firmy

Rysunek 1. Połączenie przychodzące rozłączające trwające połączenie z aplikacji innej firmy.

Aplikacja do obsługi połączeń może sprawdzić, czy połączenie przychodzące powoduje rozłączenie innego połączenia, sprawdzając dodatkowe informacje o połączeniu. Upewnij się, że EXTRA_ANSWERING_DROPS_FG_CALL ma wartość TRUE, a EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME ma wartość nazwy aplikacji, której połączenie zostanie rozłączone po odebraniu połączenia przychodzącego w sieci komórkowej.

Wpisy w rejestrze połączeń z aplikacji do połączeń innych firm

Deweloperzy aplikacji do połączeń innych firm mogą włączyć rejestrowanie połączeń w swojej aplikacji w systemowym rejestrze połączeń (patrz EXTRA_LOG_SELF_MANAGED_CALLS). Oznacza to, że w rejestrze połączeń mogą się znajdować wpisy, które nie dotyczą połączeń w sieci komórkowej.

Gdy aplikacja do obsługi połączeń AOSP wyświetla wpisy w rejestrze połączeń związane z aplikacją do połączeń innej firmy, w rejestrze połączeń wyświetla się nazwa aplikacji, w której miało miejsce połączenie, jak pokazano na ilustracji:

Wpis logu połączeń z aplikacją do połączeń innej firmy

Rysunek 2. Wpis logu połączeń z nazwą aplikacji do połączeń innej firmy w aplikacji Telefon.

Aby określić nazwę aplikacji powiązanej z wpisem logu w rejestrze połączeń, użyj kolumn PHONE_ACCOUNT_COMPONENT_NAME i PHONE_ACCOUNT_ID w dostawcy rejestru połączeń, aby utworzyć instancję PhoneAccountHandle, która identyfikuje źródło wpisu logu w rejestrze połączeń. Wyślij zapytanie do TelecomManager, aby uzyskać szczegóły dotyczące klasy PhoneAccount. Aby sprawdzić, czy wpis logu w rejestrze połączeń jest z aplikacji do połączeń innej firmy, sprawdź PhoneAccount możliwości, aby zobaczyć, czy ustawiona jest wartość CAPABILITY_SELF_MANAGED.

Metoda getLabel zwróconej klasy PhoneAccount zwraca nazwę aplikacji powiązanej z wpisem logu w rejestrze połączeń z aplikacji do połączeń innej firmy.

Elementy sterujące integracją rejestru połączeń VoIP

Od Androida 17 (poziom API 37) aplikacje do połączeń VoIP innych firm, które integrują się z Core-Telecom i CallsManager, mogą zapisywać historię połączeń bezpośrednio w natywnym systemowym rejestrze połączeń Androida (CallLog.Calls).

Aby zapewnić spójną prywatność użytkownika i higienę danych w całym ekosystemie Androida, wszystkie urządzenia z Androidem 17 (poziom API 37) i nowszym, które deklarują flagę funkcji telekomunikacyjnych (android.software.telecom) i mają rolę android.app.role.DIALER, muszą obsługiwać elementy sterujące integracją rejestru połączeń VoIP w poszczególnych aplikacjach zgodnie z dokumentem dokument definicji zgodności Androida (CDD).

Wymagania dotyczące implementacji na urządzeniu

Urządzenia muszą udostępniać ekran Ustawienia dostępny dla użytkownika (zwykle znajduje się w sekcji Ustawienia > Konta do połączeń > Zintegrowane rejestry połączeń), który umożliwia użytkownikom wyświetlanie i przełączanie integracji rejestru połączeń w przypadku poszczególnych aplikacji VoIP innych firm.

Aby spełnić to wymaganie, musisz zintegrować domyślne ustawienia platformy:

  • Integracja ustawień platformy: upewnij się, że urządzenie zawiera com.android.phone.settings.PhoneAccountSettingsActivity dostarczaną przez platformę Androida (com.android.phone).
  • Wymaganie dotyczące rozpoznawania intencji: urządzenie musi rozpoznawać intencję TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) na ekranie zarządzania platformą.

Gdy aplikacja, systemowy monit lub precyzyjny link wywołuje te elementy, intencja musi pomyślnie uruchomić PhoneAccountSettingsActivity i nie może zgłosić wyjątku ActivityNotFoundException:

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

Weryfikacja

Aby sprawdzić, czy urządzenie obsługuje aplikacje do połączeń innych firm, użyj aplikacji testowej Telecomm, która implementuje klasę ConnectionService zarządzaną samodzielnie. Aplikacja znajduje się w /packages/services/Telecomm/testapps/.

  1. Utwórz aplikację testową z katalogu głównego repozytorium kodu źródłowego Androida za pomocą polecenia:

    mmma packages/services/Telecomm/testapps/

  2. Zainstaluj utworzony plik APK za pomocą polecenia adb install -g -r <apk path>. Do Menu z aplikacjami zostanie dodana ikona Self-Managed Sample.

  3. Kliknij ikonę, aby otworzyć aplikację testową.

Obsługa połączeń przychodzących, które rozłączają trwające połączenie

Aby sprawdzić, czy połączenie przychodzące rozłącza trwające połączenie z aplikacji innej firmy:

Testowanie aplikacji pod kątem aplikacji do połączeń innych firm

Rysunek 3. Aplikacja testowa z przykładowymi implementacjami klasy ConnectionService.

  1. Wyczyść opcję Holdable.
  2. Aby rozpocząć nowe przykładowe połączenie wychodzące, kliknij OUTGOING.
  3. Aby aktywować połączenie, kliknij przycisk ACTIVE.
  4. Zadzwoń na numer telefonu testowanego urządzenia z innego telefonu. Spowoduje to wywołanie scenariusza, w którym aplikacja do obsługi połączeń otrzyma nazwę aplikacji, której połączenie zostanie rozłączone.
  5. Gdy skończysz, kliknij przycisk DISCONNECT w aplikacji testowej.

Wpisy w rejestrze połączeń z aplikacji do połączeń innych firm

Po wykonaniu powyższych czynności aplikacja testowa powinna zarejestrować połączenie w systemowym rejestrze połączeń. Aby potwierdzić, że urządzenie rejestruje połączenia z aplikacji do połączeń innych firm, otwórz aplikację do obsługi połączeń i sprawdź, czy połączenie jest widoczne w systemowym rejestrze połączeń.

Elementy sterujące integracją rejestru połączeń VoIP

Aby sprawdzić zgodność z wymaganiem dotyczącym intencji integracji rejestru połączeń VoIP w Androidzie 17 i nowszym, uruchom test CtsTelecomTestCases Compatibility Test Suite (CTS). Ten test sprawdza w różnych pakietach, czy wysłanie TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) powoduje rozpoznanie na urządzeniu prawidłowego wyeksportowanego modułu obsługi aktywności (sprawdzenie resolveActivity).