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

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

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

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

Самоуправляемый API ConnectionService также дает разработчикам возможность включить регистрацию вызовов в их приложении в системном журнале вызовов (см. EXTRA_LOG_SELF_MANAGED_CALLS ). В соответствии с требованиями в документе определения совместимости Android (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 возвращает имя приложения, связанного с записью журнала вызовов из стороннего приложения для совершения вызовов.

Проверка

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

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

    mmma packages/services/Telecomm/testapps/

  2. Установите сборку apk с помощью adb install -g -r <apk path> . Затем в ваш лаунчер будет добавлен значок Self-Managed Sample.

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

Обрабатывать входящие вызовы, которые отключают текущий разговор

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

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

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

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

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

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