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

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

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

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

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

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

Сценарии

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

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

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

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

См. пример пользовательского интерфейса ниже:

Входящий вызов, отключающий текущий вызов 3P
Рисунок 1. Входящий вызов, который отключает текущий вызов 3P

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

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

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

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

Запись журнала вызовов с помощью приложения для звонков 3P
Рис. 2. Запись в журнале вызовов с названием приложения 3P-вызовов в приложении для набора номера

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

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

Проверка

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

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

    mmma packages/services/Telecomm/testapps/

  2. Установите apk сборки, используя adb install -g -r <apk path> . Затем в панель запуска добавляется значок самоуправляемого образца.

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

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

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

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

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

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