В 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.
Рисунок 2. Инициализация и привязка ImsService.
Обнаружение платформы и проверка реализации ImsService
После правильного определения ImsService в AndroidManifest.xml платформу необходимо настроить для (безопасной) привязки к ImsService, когда это необходимо. Существует два типа ImsServices, к которым привязывается платформа:
- ImsService «переопределить» оператора связи: эти ImsServices предварительно загружены на устройство, но привязаны к одному или нескольким операторам сотовой связи и будут привязаны только при вставке соответствующей SIM-карты. Это настраивается с помощью
-
config_ims_mmtel_package_override_string
Ключ CarrierConfig для ImsServices, реализующих функции MMTEL. -
config_ims_rcs_package_override_string
для ImsServices, реализующих функции RCS.
-
- ImsService «по умолчанию» устройства: это ImsService по умолчанию, который загружается на устройство OEM-производителем и должен быть разработан для предоставления услуг 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
. Это заставляет платформу пересчитывать, какие ImsServices привязаны и какие функции они поддерживают. Если приложение IMS обновляет платформу без поддерживаемых функций, ImsService будет отключен до перезагрузки телефона или до тех пор, пока не будет вставлена новая SIM-карта, соответствующая приложению IMS.
Приоритет привязки для нескольких ImsService
Платформа не может поддерживать привязку ко всем возможным 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, реализующие 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
.