Поддержка сторонних приложений для звонков

Android 9 предоставляет API для лучшей поддержки сторонних приложений для звонков. Сторонние приложения для звонков обычно используют API телефонии, такие как широковещательная передача PHONE_STATE , для сосуществования с телефонными звонками от оператора связи. В результате сторонние приложения для звонков должны отдавать приоритет звонкам от оператора связи и часто прибегают к молчаливому отклонению входящих вызовов в приложении или к завершению текущего вызова, чтобы освободить место для звонка от оператора связи.

API в Android 9 поддерживают сценарии одновременных звонков между сторонними приложениями и звонками от оператора связи. Это позволяет, например, принимать входящий звонок от стороннего приложения, находясь при этом в разговоре с оператором связи. Платформа берет на себя ответственность за удержание звонка от оператора связи, когда пользователь вступает в разговор со сторонним приложением.

В Android 9 сторонним приложениям для совершения звонков рекомендуется реализовывать самоуправляемый класс ConnectionService . Дополнительную информацию о том, как создать приложение для совершения звонков с использованием этого класса, см. в разделе «Создание приложения для совершения звонков с использованием библиотеки Core-Telecom» .

Самоуправляемый класс ConnectionService также предоставляет разработчикам возможность включить запись звонков в системный журнал вызовов своего приложения (см. EXTRA_LOG_SELF_MANAGED_CALLS ). В соответствии с требованиями документа Android Compatibility Definition Document (CDD) (раздел 7.4.1.2), вы должны убедиться, что ваше приложение для набора номера или телефонное приложение отображает эти записи в журнале вызовов и показывает название стороннего приложения для звонков, из которого был совершен звонок (пример того, как приложение для набора номера AOSP соответствует этому требованию, см. в разделе «Записи в журнале вызовов из сторонних приложений для звонков »).

Приложения отвечают за установку CAPABILITY_SUPPORT_HOLD и CAPABILITY_HOLD для своих соединений. Однако в некоторых случаях приложение может не иметь возможности удерживать вызов. Фреймворк предусматривает механизмы для разрешения подобных ситуаций.

Сценарии

Вам следует модифицировать ваше приложение для набора номера, чтобы оно обрабатывало следующие сценарии.

Обработка входящих звонков, которые прерывают текущий разговор.

В ситуации, когда идет текущий звонок от третьего лица (например, в рамках вызова SuperCaller), который не поддерживает удержание, и пользователь принимает звонок с мобильного телефона (например, от своего оператора FooCom), ваше приложение для набора номера или телефонное приложение должно сообщить пользователю, что ответ на звонок от мобильного оператора завершит текущий звонок от третьего лица.

Этот аспект важен для удобства пользователя, поскольку в приложении для звонков от стороннего разработчика может быть запущен текущий разговор, который система не может удержать. Ответ на новый мобильный звонок приводит к разрыву текущего разговора с сторонним разработчиком.

Пример пользовательского интерфейса показан на рисунке:

Входящий звонок прерывает текущий звонок от третьего лица.

Рисунок 1. Входящий вызов прерывает текущий разговор с третьим лицом.

Ваше приложение для набора номера может проверить, приводит ли входящий вызов к разрыву другого вызова, проверив дополнительные параметры вызова . Убедитесь, что EXTRA_ANSWERING_DROPS_FG_CALL установлен в TRUE , а EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME установлен на имя приложения, вызов которого разрывается при ответе на входящий мобильный звонок.

Записи журнала звонков из сторонних приложений для звонков

Разработчики сторонних приложений для совершения звонков могут включить запись звонков из своего приложения в системный журнал звонков (см. EXTRA_LOG_SELF_MANAGED_CALLS ). Это означает, что в журнале звонков могут появляться записи, не относящиеся к звонкам в мобильную сеть.

Когда приложение AOSP для набора номера отображает записи журнала вызовов, относящиеся к стороннему приложению для звонков, в журнале вызовов отображается название приложения, из которого был совершен звонок, как показано на рисунке:

Запись в журнал звонков с помощью стороннего приложения для звонков

Рисунок 2. Запись в журнале вызовов с названием стороннего приложения для звонков в приложении набора номера.

Чтобы определить название приложения, связанного с записью в журнале вызовов, используйте столбцы PHONE_ACCOUNT_COMPONENT_NAME и PHONE_ACCOUNT_ID в поставщике журнала вызовов для создания экземпляра PhoneAccountHandle , который идентифицирует источник записи в журнале вызовов. Запросите TelecomManager , чтобы получить подробную информацию о классе PhoneAccount . Чтобы определить, принадлежит ли запись в журнале вызовов стороннему приложению для звонков, проверьте возможности PhoneAccount и убедитесь, что CAPABILITY_SELF_MANAGED установлен.

Метод getLabel возвращаемого объекта PhoneAccount возвращает название приложения, связанного с записью в журнале вызовов стороннего приложения для звонков.

Управление интеграцией журнала звонков VoIP

Начиная с Android 17 (уровень API 37), сторонние приложения для VoIP-звонков, интегрированные с Core-Telecom и CallsManager могут записывать историю звонков непосредственно в собственный системный журнал звонков Android ( CallLog.Calls ).

Для обеспечения единообразной конфиденциальности пользователей и гигиены данных во всей экосистеме Android все устройства на базе Android 17 (уровень API 37) и выше, которые объявляют флаг функции телекоммуникаций ( android.software.telecom ) и имеют роль android.app.role.DIALER , должны поддерживать элементы управления интеграцией журнала вызовов VoIP для каждого приложения в соответствии с документом определения совместимости Android (CDD) .

требования к реализации устройства

Устройства должны предоставлять пользователю доступный экран настроек (обычно расположенный в разделе «Настройки» > «Учетные записи вызовов» > «Интегрированные журналы вызовов »), который позволяет пользователям просматривать и включать/выключать интеграцию журналов вызовов для отдельных сторонних VoIP-приложений.

Для выполнения этого требования необходимо интегрировать стандартные настройки платформы:

  • Интеграция с настройками платформы: Убедитесь, что ваше устройство включает в себя компонент com.android.phone.settings.PhoneAccountSettingsActivity , предоставляемый платформой Android по умолчанию ( com.android.phone ).
  • Требование к разрешению намерений: Ваше устройство должно разрешать намерение TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION ( android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION ) в соответствии со стандартным экраном управления платформой.

Когда приложение, системная подсказка или прямая ссылка вызывают следующее, намерение должно успешно запустить PhoneAccountSettingsActivity и не должно вызывать исключение ActivityNotFoundException :

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

Валидация

Чтобы проверить, поддерживает ли ваше устройство сторонние приложения для звонков, используйте тестовое приложение Telecomm, которое реализует самоуправляемый класс ConnectionService . Приложение находится в /packages/services/Telecomm/testapps/ .

  1. Соберите тестовое приложение из корневой папки вашего репозитория исходного кода Android, используя:

    mmma packages/services/Telecomm/testapps/

  2. Установите собранный APK-файл с помощью adb install -g -r <apk path> . После этого на вашем лаунчере появится значок самообслуживаемого образца.

  3. Нажмите на значок, чтобы открыть тестовое приложение.

Обработка входящих звонков, которые прерывают текущий разговор.

Выполните следующие действия, чтобы убедиться, что входящий вызов прерывает текущий звонок от третьего лица.

Тестовое приложение для сторонних приложений для звонков

Рисунок 3. Тестовое приложение с примерами реализации класса ConnectionService.

  1. Снимите флажок «Удерживать» .
  2. Нажмите кнопку «Исходящий» , чтобы начать новый тестовый исходящий звонок.
  3. Нажмите кнопку «АКТИВНО» , чтобы активировать вызов.
  4. Позвоните на номер тестируемого устройства с другого телефона. Это запустит сценарий, в котором вашему номеронабирателю будет показано название приложения, вызов которого будет прерван.
  5. Когда закончите, нажмите кнопку «ОТКЛЮЧИТЬ» в тестовом приложении.

Записи журнала звонков из сторонних приложений для звонков

После выполнения описанных выше шагов тестовое приложение должно было зарегистрировать вызов в системном журнале вызовов. Чтобы подтвердить, что устройство регистрирует вызовы из сторонних приложений для звонков, откройте приложение для набора номера и убедитесь, что вызов отображается в системном журнале вызовов.

Управление интеграцией журнала звонков VoIP

Для проверки соответствия требованиям интеграции журнала вызовов VoIP на Android 17 и выше запустите тест CtsTelecomTestCases Compatibility Test Suite (CTS). Этот тест проверяет, что отправка запроса TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION ( android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION ) на устройстве приводит к корректному экспортированному обработчику активности (проверка resolveActivity ).