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-вызова.
См. пример пользовательского интерфейса ниже:

Ваше приложение для набора номера может проверить, не вызывает ли входящий вызов разъединение другого вызова, проверив дополнительные функции вызова . Убедитесь, что EXTRA_ANSWERING_DROPS_FG_CALL
установлено значение TRUE
, а EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME
установлено имя приложения, вызов которого отключается при ответе на входящий мобильный вызов.
Записи журнала вызовов из приложений для звонков 3P
Разработчики 3P-приложений для звонков могут разрешить регистрацию звонков в своем приложении в журнале системных вызовов (см. EXTRA_LOG_SELF_MANAGED_CALLS
). Это означает, что в журнале вызовов могут быть записи, не относящиеся к мобильным сетевым вызовам.
Когда приложение номеронабирателя AOSP отображает записи журнала вызовов, связанные с приложением вызова 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/
.
Создайте тестовое приложение из корня исходного репозитория Android, используя:
mmma packages/services/Telecomm/testapps/
Установите apk сборки, используя
adb install -g -r <apk path>
. Затем в панель запуска добавляется значок самоуправляемого образца.Коснитесь значка, чтобы открыть тестовое приложение.
Обработка входящих вызовов, которые отключают текущий вызов
Выполните следующие действия, чтобы убедиться, что входящий вызов отключает текущий вызов 3P.

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