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

Рисунок 1. Обзор ImsService
Используя интерфейс ImsService, разработчик IMS может предоставлять платформе важную информацию о сигнализации, например сведения о регистрации IMS, интеграции SMS через IMS и интеграции функций MmTel для голосовых и видеозвонков. ImsService API – это также Android System API, то есть его можно создавать на основе Android SDK, а не исходного кода. Приложение IMS, предустановленное на устройстве, также можно настроить так, чтобы оно обновлялось через Google Play.
Примеры и источник
В AOSP есть приложение, которое реализует части ImsService API для тестирования и разработки. Приложение находится в каталоге /testapps/ImsTestService.
Документацию по API ImsService можно найти в разделе ImsService и в других классах API.
Реализация
ImsService API – это API высокого уровня, который позволяет реализовать IMS разными способами в зависимости от доступного оборудования. Например, реализация зависит от того, полностью ли она выполняется на процессоре приложений или частично или полностью перенесена на модем. В Android нет общедоступного HAL для разгрузки процессора основной полосы частот, поэтому разгрузка должна выполняться с помощью расширения HAL для модема.
Совместимость с более старыми реализациями IMS
Хотя в Android 9 есть API ImsService, устройства, на которых используется более старая реализация IMS, не поддерживают этот API.
Для этих устройств более старые интерфейсы AIDL и классы-обертки были перенесены в пространство имен android.telephony.ims.compat. Чтобы сохранить поддержку старого API при обновлении до Android 9, на старых устройствах необходимо выполнить следующие действия:
- Измените пространство имен реализации ImsService, чтобы оно расширялось из API пространства имен
android.telephony.ims.compat. - Измените определение службы ImsService в файле AndroidManifest.xml, чтобы использовать действие фильтра намерений
android.telephony.ims.compat.ImsServiceвместо действияandroid.telephony.ims.ImsService.
Затем фреймворк подключится к ImsService, используя уровень совместимости, предоставленный в Android 9, чтобы работать с устаревшей реализацией ImsService.
Регистрация ImsService в фреймворке
ImsService API реализован как сервис, к которому фреймворк 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, необходимо указать, какие функции IMS он поддерживает. В настоящее время Android поддерживает функции MmTel и RCS, но в платформу интегрирована только MmTel. Хотя в платформу не интегрированы API RCS, объявление 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, переопределяющий оператора. Эти сервисы предварительно загружены на устройство, но привязаны к одному или нескольким операторам мобильной связи и будут связаны только после того, как будет вставлена соответствующая SIM-карта. Это можно настроить с помощью параметра
config_ims_mmtel_package_override_stringКлюч CarrierConfig для ImsServices, реализующих функции MMTEL.config_ims_rcs_package_override_stringдля ImsServices, реализующих функции RCS.
- ImsService по умолчанию. Этот сервис загружается на устройство производителем OEM и предназначен для предоставления IMS-сервисов во всех ситуациях, когда сервис оператора недоступен. Он полезен, если в устройство не вставлена SIM-карта или для вставленной SIM-карты не установлен сервис оператора. Это определяется в оверлее устройства с помощью следующих конфигураций:
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.
Приоритет привязки для нескольких ImsService
Фреймворк не может поддерживать привязку ко всем возможным ImsService, которые предварительно загружены на устройство, и будет привязываться к двум ImsService на слот 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, определенного в переопределении Carrier Configuration, фреймворк вернется к ImsService по умолчанию. Например, в таблице ниже показано, какую функцию IMS будет использовать фреймворк, если в системе установлены три приложения IMS, реализующие ImsServices, со следующими функциями:
- ImsService оператора A поддерживает RCS
- ImsService оператора B поддерживает 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 или IMS-специфического класса ProvisioningManager. Приложение может отслеживать определенные сервисные и инициализационные статусы IMS, например:
- Функции MMTEL или RCS, которые включены и доступны
- Обновляется при изменении статуса регистрации IMS
- Статус инициализации функций IMS
- Функции IMS, включенные пользователем.
Используйте ImsStateCallback
Хотя ImsService – это сервис с постоянной привязкой, привязанный сервис может измениться, когда активируется новая SIM-карта или встроенная подписка или когда меняется конфигурация оператора. Поскольку ImsService не является частью процесса телефонии, приложение может столкнуться с непредвиденными исключениями при попытке доступа к API IMS, если ImsService незаметно аварийно завершает работу или отключается из-за изменения подписки или конфигурации.
На устройствах с Android 13 или более поздней версией ОС приложение может использовать класс ImsStateCallback, чтобы отслеживать доступность экземпляра ImsService для связанной подписки. При получении экземпляра 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.