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/
.
Создайте тестовое приложение из корня исходного репозитория Android, используя:
mmma packages/services/Telecomm/testapps/
Установите APK-файл сборки, используя
adb install -g -r <apk path>
. После этого на вашу панель запуска добавляется значок «Самоуправляемый образец».Коснитесь значка, чтобы открыть тестовое приложение.
Обработка входящих вызовов, которые отключают текущий вызов
Выполните следующие действия, чтобы убедиться, что входящий вызов отключает текущий сторонний вызов.
Рис. 3. Тестовое приложение с примерами реализации API ConnectionService.
- Снимите флажок «Удерживаемый» .
- Нажмите «ИСХОДЯЩИЙ» , чтобы начать новый образец исходящего вызова.
- Нажмите кнопку АКТИВНО , чтобы активировать вызов.
- Позвоните по номеру телефона тестируемого устройства с другого телефона. Это вызывает сценарий, в котором вашему номеронабирателю предоставляется имя приложения, вызов которого будет отключен.
- Когда вы закончите, нажмите кнопку ОТКЛЮЧИТЬ в тестовом приложении.
Записи журнала вызовов из сторонних приложений для звонков
После выполнения описанных выше шагов тестовое приложение должно было зарегистрировать вызов в журнале системных вызовов. Чтобы убедиться, что устройство регистрирует вызовы из сторонних приложений для вызовов, откройте приложение для набора номера и убедитесь, что вызов отображается в системном журнале вызовов.