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

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. Когда вы закончите, нажмите кнопку ОТКЛЮЧИТЬ в тестовом приложении.

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

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