Внедрить IMS

В Android 9 представлен интерфейс SystemApi под названием ImsService , который поможет реализовать подсистему IP-мультимедиа (IMS). API ImsService — это чётко определённый интерфейс между платформой Android и реализацией IMS, предоставляемой поставщиком или оператором.

Обзор ImsService

Рисунок 1. Обзор ImsService

Используя интерфейс ImsService, разработчик IMS может предоставлять платформе важную сигнальную информацию, такую ​​как регистрационные данные IMS, интеграцию SMS через IMS и интеграцию функций MmTel для обеспечения голосовых и видеозвонков. API ImsService также является системным API Android, то есть его можно разрабатывать непосредственно на основе Android SDK, а не на основе исходного кода. Предустановленное на устройстве приложение IMS также можно настроить для обновления через Play Маркет.

Примеры и источники

Android предоставляет приложение на AOSP, реализующее части API ImsService для тестирования и разработки. Его можно найти по адресу /testapps/ImsTestService .

Документацию по API ImsService можно найти в ImsService и в других классах API.

Выполнение

API ImsService — это высокоуровневый API, позволяющий реализовать IMS различными способами в зависимости от доступного оборудования. Например, реализация IMS меняется в зависимости от того, полностью ли реализована IMS на процессоре приложений или же она частично или полностью выгружена на модем. Android не предоставляет общедоступный HAL для выгрузки на процессор основной полосы частот, поэтому любая выгрузка должна осуществляться с помощью расширения HAL для модема.

Совместимость со старыми реализациями IMS

Хотя Android 9 включает API ImsService, устройства, использующие более старую реализацию IMS, не поддерживают этот API. Для этих устройств старые интерфейсы AIDL и классы-обёртки перенесены в пространство имён android.telephony.ims.compat . При обновлении до Android 9 для более старых устройств необходимо выполнить следующие действия, чтобы продолжить поддержку старого API.

  • Измените пространство имен реализации ImsService так, чтобы оно расширяло API пространства имен android.telephony.ims.compat .
  • Измените определение службы ImsService в AndroidManifest.xml, чтобы использовать действие фильтра намерений android.telephony.ims.compat.ImsService вместо действия android.telephony.ims.ImsService .

Затем фреймворк привяжется к ImsService, используя уровень совместимости, предоставленный в Android 9, для работы с устаревшей реализацией ImsService .

Регистрация ImsService в фреймворке

API ImsService реализован как сервис, к которому фреймворк Android подключается для взаимодействия с реализацией IMS. Для регистрации приложения, реализующего ImsService, в фреймворке необходимо выполнить три шага. Во-первых, реализация ImsService должна зарегистрироваться на платформе с помощью файла AndroidManifest.xml приложения; во-вторых, необходимо указать, какие функции IMS поддерживает реализация (MmTel или RCS); и, в-третьих, она должна быть проверена как доверенная реализация IMS либо в конфигурации оператора, либо в оверлейной конфигурации устройства.

Определение услуги

Приложение IMS регистрирует ImsService в фреймворке, добавляя запись service в манифест, используя следующий формат:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

Определение service в AndroidManifest.xml определяет следующие атрибуты, необходимые для корректной работы:

  • directBootAware="true" : позволяет обнаружить и запустить службу с помощью telephony до того, как пользователь разблокирует устройство. Служба не сможет получить доступ к зашифрованному хранилищу устройства до того, как пользователь разблокирует устройство. Подробнее см. в разделах Поддержка режима прямой загрузки и шифрования на основе файлов .
  • persistent="true" : позволяет службе работать постоянно и не останавливаться системой для освобождения памяти. Этот атрибут работает ТОЛЬКО, если приложение создано как системное.
  • permission="android.permission.BIND_IMS_SERVICE" : гарантирует, что привязка к приложению будет доступна только процессу, которому предоставлено разрешение BIND_IMS_SERVICE . Это предотвращает привязку вредоносного приложения к службе, поскольку фреймворк может предоставить это разрешение только системным приложениям.

Служба также должна указать элемент intent-filter с действием android.telephony.ims.ImsService . Это позволит фреймворку найти ImsService .

Спецификация функций IMS

После определения ImsService как службы Android в файле AndroidManifest.xml, ImsService должен определить, какие функции IMS он поддерживает. В настоящее время Android поддерживает функции MmTel и RCS, однако в фреймворк интегрирован только MmTel. Несмотря на отсутствие интегрированных в фреймворк API RCS, объявление его в качестве функции ImsService имеет свои преимущества.

Ниже приведены допустимые функции, определённые в android.telephony.ims.ImsFeature , которые может предоставлять ImsService, а также объяснение и пример того, почему приложению IMS может потребоваться реализовать одну или все эти функции. После определения каждой функции на этой странице описывается, как ImsService объявляет набор функций, определяемых для каждого слота SIM-карты.

FEATURE_MMTEL

ImsService реализует функцию IMS MMTEL, которая включает поддержку всех носителей IMS (спецификации IR.92 и IR.94), за исключением экстренного подключения к IMS PDN для экстренных вызовов. Любая реализация ImsService , которая должна поддерживать функции MMTEL, должна расширить базовый класс android.telephony.ims.MmTelFeature и вернуть пользовательскую реализацию MmTelFeature в ImsService#createMmTelFeature .

FEATURE_EMERGENCY_MMTEL

Объявление этой функции только сигнализирует платформе о возможности экстренного подключения к IMS PDN для экстренных служб. Если эта функция не объявлена ​​для вашего ImsService , платформа всегда будет по умолчанию использовать резервный режим коммутации каналов для экстренных служб. Для определения этой функции необходимо определить функцию FEATURE_MMTEL .

FEATURE_RCS

API ImsService не реализует функции IMS RCS, но базовый класс android.telephony.ims.RcsFeature всё ещё может быть полезен. Фреймворк автоматически привязывается к ImsService и вызывает ImsService#createRcsFeature когда обнаруживает, что пакет должен предоставлять RCS. Если SIM-карта, связанная с сервисом RCS, извлекается, фреймворк автоматически вызывает RcsFeature#onFeatureRemoved , а затем очищает ImsService связанный с функцией RCS. Эта функциональность может удалить часть пользовательской логики обнаружения или привязки, которую в противном случае пришлось бы предоставлять функции RCS.

Регистрация поддерживаемых функций

Фреймворк телефонии сначала привязывается к ImsService для запроса поддерживаемых им функций с помощью API ImsService#querySupportedImsFeatures . После того, как фреймворк определит, какие функции будет поддерживать ImsService, он вызовет ImsService#create[...]Feature для каждой функции, за которую будет отвечать ImsService. Если набор поддерживаемых приложением IMS функций изменится, можно использовать ImsService#onUpdateSupportedImsFeatures чтобы сообщить фреймворку о необходимости пересчитать поддерживаемые функции. Подробнее об инициализации и привязке ImsService см. на следующей схеме.

Инициализация и привязка ImsService

Рисунок 2. Инициализация и привязка ImsService

Обнаружение и проверка фреймворка реализации ImsService

После корректного определения ImsService в AndroidManifest.xml необходимо настроить платформу для (безопасного) подключения к ImsService при необходимости. Фреймворк привязывается к двум типам ImsServices:

  1. Переопределение оператором ImsService: эти ImsServices предустановлены на устройстве, но привязаны к одному или нескольким операторам сотовой связи и будут привязаны только при установке соответствующей SIM-карты. Это настраивается с помощью
  2. ImsService устройства «по умолчанию»: это ImsService по умолчанию, загружаемый на устройство производителем оригинального оборудования (OEM) и предназначенный для предоставления услуг IMS в ситуациях, когда ImsService оператора недоступен, и полезен в ситуациях, когда в устройстве не установлена ​​SIM-карта или на установленной SIM-карте не установлен ImsService оператора. Это определяется в оверлее устройства с использованием следующих конфигураций:

Android не поддерживает приложения со сторонними загружаемыми реализациями ImsService, поэтому любые реализации ImsService, определённые здесь, должны быть системными приложениями и находиться в папке /system/priv-app/ или /product/priv-app/ для предоставления соответствующих разрешений (а именно разрешений на доступ к телефону, микрофону, местоположению, камере и контактам). Проверяя соответствие имени пакета реализации IMS значениям CarrierConfig или наложения устройства, определённым выше, привязываются только доверенные предустановленные приложения.

Настройка

Приложения, реализующие ImsService, привязаны только к устройствам, на которых они настроены как «переопределяющие» ImsService оператора или конфигурации ImsService устройства «по умолчанию» для функций MMTEL или RCS. ImsService также позволяет динамически включать и отключать поддерживаемые им функции IMS (MMTEL и RCS) с помощью обновлений с помощью метода ImsService#onUpdateSupportedImsFeatures . Это запускает перерасчет фреймворком привязанных ImsService и поддерживаемых ими функций. Если приложение IMS обновит фреймворк без поддерживаемых функций, привязка ImsService будет отменена до перезагрузки телефона или установки новой SIM-карты, соответствующей приложению IMS.

Приоритет привязки для нескольких ImsService

Платформа не может поддерживать привязку ко всем возможным ImsServices, которые предварительно загружены на устройство, и будет привязываться максимум к двум ImsServices на слот SIM-карты (по одному ImsService для каждой функции) в следующем порядке для каждой функции:

  1. Имя пакета ImsService определяется значением CarrierConfig config_ims_[mmtel/rcs]_package_override_string когда вставлена ​​SIM-карта.
  2. Имя пакета ImsService, указанное в оверлейном значении устройства для config_ims_[mmtel/rcs]_package включая случай, когда SIM-карта не установлена. Этот пакет ImsService ДОЛЖЕН поддерживать функцию экстренного вызова MmTel.

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

Давайте разберём каждую функцию подробнее. Для устройства (с одной или несколькими SIM-картами) с одной установленной SIM-картой возможны две функции IMS: MMTel и RCS. Фреймворк попытается выполнить привязку в порядке, указанном выше, для каждой функции, и если функция недоступна для ImsService, указанного в переопределении конфигурации оператора, фреймворк переключится на ваш ImsService по умолчанию. Например, в таблице ниже описано, какую функцию IMS будет использовать фреймворк, если три приложения IMS, реализующие ImsServices, установлены в системе со следующими функциями:

  • Оператор связи A ImsService поддерживает RCS
  • Оператор B ImsService поддерживает RCS и MMTel
  • OEM ImsService поддерживает RCS и MMTel
SIM-карта вставлена Функция RCS Функция MMTel
Перевозчик А Перевозчик А OEM
Перевозчик Б Перевозчик Б Перевозчик Б
Нет SIM-карты OEM OEM

Проверка

Инструменты для проверки самой реализации IMS не включены, поскольку спецификации IMS чрезвычайно обширны и требуют специального верификационного оборудования. Тесты позволяют лишь проверить корректность работы фреймворка телефонии с API ImsService.

Разработать приложение IMS

При разработке приложения IMS, взаимодействующего со стеком телефонии Android, мы рекомендуем указать, что приложение может прослушивать или изменять состояние экземпляра ImsService, подключенного к конкретной подписке оператора.

Чтобы прослушивать или изменять состояние ImsService для функций MMTEL и RCS, используйте класс ImsManager для получения экземпляра класса ImsMmTelManager , ImsRcsManager или класса ProvisioningManager , специфичного для IMS. Приложение может прослушивать состояния служб и провижининга, специфичные для IMS, например:

  • Функции MMTEL или RCS, которые включены и доступны
  • Обновления при изменении состояния регистрации IMS
  • Статус предоставления функций IMS
  • Функции IMS, которые включил пользователь

Использовать ImsStateCallback

Хотя ImsService — это постоянно привязанная служба, привязанная служба может измениться при активации новой SIM-карты или встроенной подписки, а также при изменении настроек оператора. Поскольку ImsService не является частью процесса телефонии, приложение может столкнуться с непредвиденными исключениями при попытке доступа к API IMS, если ImsService незаметно аварийно завершает работу или отключается из-за изменения подписки или конфигурации.

На устройствах под управлением Android 13 и выше для отслеживания доступности экземпляра ImsService для связанной подписки приложение может использовать класс ImsStateCallback . При получении экземпляра ImsMmTelManager или ImsRcsManager рекомендуется сначала зарегистрировать обратный вызов состояния IMS с помощью ImsMmTelManager#registerImsStateCallback или ImsRcsManager#registerImsStateCallback . Чтобы продолжить получать обновления обратных вызовов для определённых подписок после того, как ImsService снова станет доступен, приложение должно отменить регистрацию или удалить существующие обратные вызовы, зарегистрированные через ImsMmTelManager , ImsRcsManager или ProvisioningManager , и зарегистрировать новые обратные вызовы.

Если подписка не поддерживает IMS, фреймворк вызывает ImsStateCallback#onUnavailable с причиной REASON_NO_IMS_SERVICE_CONFIGURED . Это означает, что ImsService и API, связанные с IMS, недоступны для подписки.

В маловероятном случае сбоя процесса телефонии приложение получает ImsStateCallback#onError и больше не получает обновления для зарегистрированного экземпляра ImsStateCallback . Чтобы выйти из этой ситуации, перерегистрируйте экземпляр ImsStateCallback для соответствующей подписки, вызвав метод ImsMmTelManager#registerImsStateCallback или ImsRcsManager#registerImsStateCallback .