Внедрить IMS

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

Обзор ImsService

Рисунок 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, чтобы использовать действие фильтра намерений 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 , платформа всегда будет по умолчанию использовать Circuit Switch Fallback для экстренных служб. Для определения этой функции необходимо определить функцию 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 оператора или устройства «по умолчанию» для функциональности MMTEL или RCS. ImsService также позволяет динамически включать или отключать поддерживаемые им функции IMS (MMTEL и RCS) с помощью обновлений с использованием метода ImsService#onUpdateSupportedImsFeatures . Это запускает фреймворк для пересчета привязанных ImsServices и поддерживаемых ими функций. Если приложение 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 ДОЛЖЕН поддерживать функцию Emergency 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 .