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

Рисунок 1. Обзор ImsService
Используя интерфейс ImsService, разработчик IMS может предоставлять платформе важную сигнальную информацию, такую как данные о регистрации IMS, интеграция SMS через IMS и интеграция функций MmTel для голосовых и видеозвонков. API ImsService также является системным API Android, что означает, что его можно собирать непосредственно с использованием Android SDK, а не с исходным кодом. Приложение IMS, предустановленное на устройстве, также может быть настроено для обновления через Play Store.
Примеры и источник
В Android есть приложение на платформе AOSP, которое реализует часть API ImsService для целей тестирования и разработки. Приложение можно найти по адресу /testapps/ImsTestService .
Документацию по API ImsService можно найти в самом классе ImsService , а также в других классах этого API.
Выполнение
API ImsService — это высокоуровневый API, позволяющий реализовать 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, чтобы использовать действие intent-filter
android.telephony.ims.compat.ImsServiceвместо действияandroid.telephony.ims.ImsService.
Затем фреймворк будет использовать слой совместимости, предоставленный в Android 9, для связи с устаревшей реализацией ImsService .
Регистрация ImService в рамках фреймворка
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>
В файле AndroidManifest.xml в определении service задаются следующие атрибуты, необходимые для корректной работы:
-
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 см. на следующей диаграмме.

Рисунок 2. Инициализация и привязка ImsService.
Обнаружение и проверка реализации ImsService с помощью фреймворка
После того, как ImsService будет корректно определен в AndroidManifest.xml, платформу необходимо настроить для (безопасного) подключения к ImsService при необходимости. Фреймворк подключается к двум типам ImsService:
- Переопределение ImsService оператором связи: Эти ImsService предварительно загружены в устройство, но привязаны к одному или нескольким сотовым операторам и будут привязаны только при установке соответствующей SIM-карты. Это настраивается с помощью
-
config_ims_mmtel_package_override_stringключ CarrierConfig для ImsServices, реализующих функции MMTEL. -
config_ims_rcs_package_override_stringиспользуется для ImsServices, реализующих функции RCS.
-
- ImsService по умолчанию для устройства: это ImsService по умолчанию, загружаемый на устройство производителем оборудования и предназначенный для предоставления услуг IMS во всех ситуациях, когда ImsService оператора связи недоступен, и полезен в ситуациях, когда в устройство не вставлена SIM-карта или на вставленной SIM-карте не установлен ImsService оператора связи. Это определяется в оверлее устройства с помощью следующих конфигураций:
-
config_ims_mmtel_package: Реализует функции MMTEL -
config_ims_rcs_package: Реализует функции RCS
-
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.
Приоритет привязки для нескольких ImService
Данная платформа не поддерживает привязку ко всем возможным ImsServices, предварительно загруженным на устройство, и будет привязываться максимум к двум ImsServices на каждый слот SIM-карты (по одному ImsService для каждой функции) в следующем порядке для каждой функции:
- Имя пакета ImsService определяется значением CarrierConfig
config_ims_[mmtel/rcs]_package_override_stringпри наличии вставленной SIM-карты. - Имя пакета ImsService, определенное в значении наложения устройства для
config_ims_[mmtel/rcs]_packageвключая случай, когда SIM-карта не вставлена. Этот ImsService ДОЛЖЕН поддерживать функцию Emergency MmTel.
Необходимо либо указать имя пакета ImsService в файле CarrierConfig для каждого из операторов связи, которые будут использовать этот пакет, либо в оверлее устройства, если ваш ImsService будет использоваться по умолчанию, как указано выше.
Давайте разберем это для каждой функции. Для устройства (с одной или несколькими SIM-картами) с одной установленной SIM-картой возможны две функции IMS: MMTel и RCS. Платформа будет пытаться выполнить привязку в порядке, определенном выше для каждой функции, и если функция недоступна для ImsService, определенного в настройках конфигурации оператора, платформа будет использовать вашу ImsService по умолчанию. Например, в таблице ниже описано, какую функцию IMS будет использовать платформа, учитывая три приложения IMS, реализующие ImsService, установленные в системе со следующими функциями:
- Оператор A ImService поддерживает RCS
- Carrier B ImsService поддерживает RCS и MMTel.
- OEM ImsService поддерживает RCS и MMTel
| SIM-карта вставлена | Функция RCS | Функция MMTel |
|---|---|---|
| Авианосец А | Авианосец А | OEM |
| Авианосец B | Авианосец B | Авианосец B |
| 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, которые пользователь включил.
Используйте ImStateCallback
Хотя 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 и связанные с IMS API недоступны для данной подписки.
В маловероятном случае сбоя процесса телефонии приложение получит ImsStateCallback#onError и перестанет получать обновления для зарегистрированного экземпляра ImsStateCallback . Для восстановления после этого состояния необходимо повторно зарегистрировать экземпляр ImsStateCallback для соответствующей подписки, вызвав ImsMmTelManager#registerImsStateCallback или ImsRcsManager#registerImsStateCallback .