Внедрение IMS

В Android 9 представлен новый интерфейс SystemApi под названием ImsService , который поможет вам реализовать подсистему IP Multimedia (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, чтобы использовать действие фильтра намерений 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 . Это заставляет платформу пересчитывать, какие 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, установленные в системе со следующими функциями:

  • Оператор связи ImsService поддерживает RCS
  • Оператор B ImsService поддерживает RCS и MMTel.
  • OEM ImsService поддерживает RCS и MMTel
SIM-карта вставлена Функция RCS Функция ММТел
Перевозчик А Перевозчик А 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 .