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

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

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

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

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

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

Сценарии

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

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

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

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

See the user interface in the figure for an example:

Incoming call disconnecting an ongoing third-party call

Рисунок 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 , который идентифицирует источник записи в журнале вызовов. Для получения подробной информации о PhoneAccount выполните запрос к TelecomManager .
Чтобы определить, принадлежит ли запись в журнале вызовов стороннему приложению для звонков, проверьте возможности PhoneAccount и убедитесь, что CAPABILITY_SELF_MANAGED установлен.

The getLabel method of the returned PhoneAccount returns the name of the app associated with a call log entry from the third-party calling app.

Валидация

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

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

    mmma packages/services/Telecomm/testapps/

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

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

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

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

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

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

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

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

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