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

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> . После этого на панель запуска будет добавлен значок образца с самостоятельным управлением.

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

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

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

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

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

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

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

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