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

В Android 9 добавлены API для улучшения поддержки сторонних приложений для звонков. Сторонние приложения для звонков обычно используют API телефонии, например PHONE_STATE, чтобы работать одновременно с телефонными звонками оператора. Поэтому сторонние приложения для звонков должны отдавать приоритет звонкам оператора и часто без уведомления отклонять входящие звонки в приложении или завершать текущий звонок, чтобы освободить место для звонка оператора.

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

В Android 9 сторонним приложениям для звонков рекомендуется реализовать класс ConnectionService с самостоятельным управлением. Подробнее о том, как создать приложение для звонков с помощью этого класса, рассказано в статье Как создать приложение для звонков с помощью библиотеки Core-Telecom.

Класс 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 возвращает название приложения, связанного с записью в журнале вызовов из стороннего приложения для звонков.

Настройки интеграции журнала вызовов VoIP

Начиная с Android 17 (уровень API 37) сторонние приложения для VoIP-звонков, интегрированные с Core-Telecom и CallsManager, могут записывать историю звонков напрямую в системный журнал вызовов Android (CallLog.Calls).

Чтобы обеспечить конфиденциальность пользователей и гигиену данных в экосистеме Android, все устройства с Android 17 (уровень API 37) и более поздними версиями, на которых объявлен флаг функции telecom (android.software.telecom) и есть роль android.app.role.DIALER, должны поддерживать элементы управления интеграцией списка вызовов VoIP для каждого приложения в соответствии с перечнем условий совместимости Android (CDD).

Требования к реализации на устройствах

На устройствах должен быть доступный пользователю экран Настройки (обычно он находится в разделе Настройки > Аккаунты для звонков > Интегрированные списки вызовов), на котором можно просматривать и включать или отключать интеграцию списка вызовов для отдельных сторонних VoIP-приложений.

Чтобы выполнить это требование, необходимо интегрировать стандартную платформу:

  • Интеграция настроек платформы. Убедитесь, что в устройстве есть com.android.phone.settings.PhoneAccountSettingsActivity, предоставляемый платформой Android (com.android.phone).
  • Требование к разрешению намерений. Ваше устройство должно разрешать намерение TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) на стандартном экране управления платформой.

Если приложение, системный запрос или ссылка на контент вызывает следующие действия, намерение должно успешно запустить PhoneAccountSettingsActivity и не должно вызывать ActivityNotFoundException:

Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);

Проверка

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

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

    mmma packages/services/Telecomm/testapps/

  2. Установите APK-файл с помощью adb install -g -r <apk path>. После этого на панели запуска появится значок Self-Managed Sample.

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

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

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

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

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

  1. Снимите флажок Возможность удержания.
  2. Нажмите Исходящий, чтобы начать новый исходящий вызов.
  3. Нажмите кнопку Активный, чтобы сделать вызов активным.
  4. Позвоните на номер телефона тестируемого устройства с другого телефона. В этом случае в номеронабиратель передается название приложения, звонок из которого будет сброшен.
  5. Когда вы закончите, нажмите кнопку Отключить в тестовом приложении.

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

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

Настройки интеграции списка вызовов VoIP

Чтобы проверить, соответствует ли ваше приложение требованиям к интеграции списка вызовов VoIP на устройствах с Android 17 и более поздних версий, запустите тест CtsTelecomTestCases Compatibility Test Suite (CTS). Этот тест проверяет, что при отправке TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) на устройстве выполняется переход к действительному экспортированному обработчику действий (проверка resolveActivity).