Implementación de IMS

Android 9 presenta una nueva interfaz SystemApi llamada ImsService para ayudarlo a implementar el subsistema multimedia IP (IMS). La API ImsService es una interfaz bien definida entre la plataforma Android y la implementación de IMS proporcionada por un proveedor o operador.

Descripción general de ImsService

Figura 1. Descripción general de ImsService

Al utilizar la interfaz ImsService, el implementador de IMS puede proporcionar información de señalización importante a la plataforma, como información de registro de IMS, integración de SMS sobre IMS e integración de funciones MmTel para proporcionar llamadas de voz y video. La API ImsService también es una API del sistema Android, lo que significa que se puede crear directamente en el SDK de Android en lugar de en la fuente. Una aplicación IMS que haya sido preinstalada en el dispositivo también se puede configurar para que sea actualizable en Play Store.

Ejemplos y fuente

Android proporciona una aplicación en AOSP que implementa partes de la API ImsService con fines de prueba y desarrollo. Puede encontrar la aplicación en /testapps/ImsTestService .

Puede encontrar la documentación de la API ImsService en ImsService y en las otras clases de la API.

Implementación

La API ImsService es una API de alto nivel que le permite implementar IMS de muchas maneras, según el hardware disponible. Por ejemplo, la implementación cambia dependiendo de si la implementación de IMS está completamente en el procesador de la aplicación o si está parcial o totalmente descargada en el módem. Android no proporciona un HAL público para la descarga al procesador de banda base, por lo que cualquier descarga debe realizarse utilizando su extensión HAL al módem.

Compatibilidad con implementaciones IMS anteriores

Aunque Android 9 incluye la API ImsService, los dispositivos que utilizan una implementación anterior para IMS no pueden admitir la API. Para estos dispositivos, las interfaces AIDL más antiguas y las clases contenedoras se han movido al espacio de nombres android.telephony.ims.compat . Al actualizar a Android 9, los dispositivos más antiguos deben hacer lo siguiente para continuar siendo compatibles con la API anterior.

  • Cambie el espacio de nombres de la implementación de ImsService para extenderlo desde la API del espacio de nombres android.telephony.ims.compat .
  • Modifique la definición del servicio ImsService en AndroidManifest.xml para usar la acción de filtro de intención android.telephony.ims.compat.ImsService , en lugar de la acción android.telephony.ims.ImsService .

Luego, el marco se vinculará a ImsService utilizando la capa de compatibilidad proporcionada en Android 9 para trabajar con la implementación heredada ImsService .

Registro de ImsService con el framework.

La API ImsService se implementa como un servicio al que se vincula el marco de trabajo de Android para comunicarse con la implementación de IMS. Son necesarios tres pasos para registrar una aplicación que implemente un ImsService con el marco. Primero, la implementación de ImsService debe registrarse en la plataforma utilizando el AndroidManifest.xml de la aplicación; en segundo lugar, debe definir qué funciones IMS admite la implementación (MmTel o RCS); y tercero, debe verificarse como la implementación IMS confiable, ya sea en la configuración del operador o en la superposición del dispositivo.

Definición de servicio

La aplicación IMS registra un ImsService con el marco agregando una entrada service en el manifiesto usando el siguiente formato:

<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>

La definición service en AndroidManifest.xml define los siguientes atributos, que son necesarios para el correcto funcionamiento:

  • directBootAware="true" : permite descubrir y ejecutar el servicio por telephony antes de que el usuario desbloquee el dispositivo. El servicio no puede acceder al almacenamiento cifrado del dispositivo antes de que el usuario lo desbloquee. Para obtener más información, consulte Compatibilidad con el modo de inicio directo y cifrado basado en archivos .
  • persistent="true" : permite que este servicio se ejecute de forma persistente y que el sistema no lo elimine para recuperar memoria. Este atributo SÓLO funciona si la aplicación está creada como una aplicación del sistema.
  • permission="android.permission.BIND_IMS_SERVICE" : garantiza que solo un proceso al que se le haya otorgado el permiso BIND_IMS_SERVICE pueda vincularse a la aplicación. Esto evita que una aplicación maliciosa se vincule al servicio, ya que el marco solo puede otorgar permiso a las aplicaciones del sistema.

El servicio también debe especificar el elemento intent-filter con la acción android.telephony.ims.ImsService . Esto permite que el marco encuentre ImsService .

Especificación de características IMS

Una vez que ImsService se haya definido como un servicio de Android en AndroidManifest.xml, ImsService debe definir qué funciones de IMS admite. Actualmente, Android admite las funciones MmTel y RCS; sin embargo, solo MmTel está integrado en el marco. Aunque no hay API RCS integradas en el marco, aún existen ventajas al declararlo como una característica de ImsService.

A continuación se muestran las funciones válidas definidas en android.telephony.ims.ImsFeature que un ImsService puede proporcionar y una explicación y un ejemplo de por qué una aplicación IMS querría implementar una o todas estas funciones. Después de definir cada característica, esta página describe cómo ImsService declara el conjunto de características que define para cada ranura SIM.

FUNCIÓN_MMTEL

ImsService implementa la función IMS MMTEL, que contiene soporte para todos los medios IMS (especificaciones IR.92 e IR.94), excepto la conexión de emergencia al IMS PDN para llamadas de emergencia. Cualquier implementación de ImsService que desee admitir las funciones MMTEL debe ampliar la clase base android.telephony.ims.MmTelFeature y devolver una implementación personalizada MmTelFeature en ImsService#createMmTelFeature .

FEATURE_EMERGENCY_MMTEL

Declarar esta característica solo indica a la plataforma que es posible conectarse de emergencia al IMS PDN para los servicios de emergencia. Si esta función no está declarada para su ImsService , la plataforma siempre utilizará de forma predeterminada el Circuit Switch Fallback para los servicios de emergencia. La característica FEATURE_MMTEL debe estar definida para que se defina esta característica.

FUNCIÓN_RCS

La API ImsService no implementa ninguna característica de IMS RCS, pero la clase base android.telephony.ims.RcsFeature aún puede resultar útil. El marco se vincula automáticamente a ImsService y llama a ImsService#createRcsFeature cuando detecta que el paquete debe proporcionar RCS. Si se elimina la tarjeta SIM asociada con el servicio RCS, el marco llama automáticamente RcsFeature#onFeatureRemoved y luego limpia el ImsService asociado con la función RCS. Esta funcionalidad puede eliminar parte de la lógica de detección/vinculación personalizada que, de otro modo, una función RCS tendría que proporcionar.

Registro de funciones compatibles

El marco de telefonía primero se vincula a ImsService para consultar las funciones que admite mediante la API ImsService#querySupportedImsFeatures . Después de que el marco calcule qué funciones admitirá ImsService, llamará a ImsService#create[...]Feature para cada función de la que ImsService será responsable. Si las características que admite la aplicación IMS cambian, puede usar ImsService#onUpdateSupportedImsFeatures para indicarle al marco que vuelva a calcular las características admitidas. Consulte el diagrama a continuación para obtener más información sobre la inicialización y vinculación de ImsService.

ImsService inicializando y vinculando

Figura 2: Inicialización y enlace de ImsService

Detección y verificación del marco de una implementación de ImsService

Una vez que ImsService se haya definido correctamente en AndroidManifest.xml, la plataforma debe configurarse para vincularse (de forma segura) a ImsService cuando sea apropiado. Hay dos tipos de ImsServices a los que se vincula el marco:

  1. ImsService de "anulación" del operador: estos ImsServices están precargados en el dispositivo, pero están conectados a uno o más operadores de telefonía celular y solo estarán vinculados cuando se inserte una tarjeta SIM coincidente. Esto se configura usando el
  2. ImsService "predeterminado" del dispositivo: este es el ImsService predeterminado que un OEM carga en el dispositivo y debe diseñarse para proporcionar servicios IMS en todas las situaciones en las que un ImsService del operador no está disponible y es útil en situaciones en las que el dispositivo no tiene tarjeta SIM. insertada o la tarjeta SIM insertada no tiene instalado ningún ImsService del operador. Esto se define en la superposición del dispositivo mediante las siguientes configuraciones:

Android no admite aplicaciones con implementaciones de ImsService descargables de terceros, por lo que cualquier implementación de ImsService definida aquí debe ser aplicación del sistema y debe residir en la carpeta /system/priv-app/ o /product/priv-app/ para otorgar la autorización adecuada. permisos (es decir, permisos de teléfono, micrófono, ubicación, cámara y contactos). Al verificar si el nombre del paquete de la implementación de IMS coincide con los valores de CarrierConfig o de superposición del dispositivo definidos anteriormente, solo se vinculan las aplicaciones confiables preinstaladas.

Personalización

Las aplicaciones que implementan un ImsService solo están vinculadas a dispositivos en los que están configurados como ImsService de "anulación" del operador o configuraciones de ImsService "predeterminadas" del dispositivo para la funcionalidad MMTEL o RCS. ImsService también permite que las funciones IMS que admite (MMTEL y RCS) se habiliten o deshabiliten dinámicamente mediante actualizaciones utilizando el método ImsService#onUpdateSupportedImsFeatures . Esto hace que el marco vuelva a calcular qué ImsServices están vinculados y qué características admiten. Si la aplicación IMS actualiza el marco sin funciones compatibles, ImsService se desvinculará hasta que se reinicie el teléfono o se inserte una nueva tarjeta SIM que coincida con la aplicación IMS.

Prioridad vinculante para múltiples ImsService

El marco no puede admitir la vinculación a todos los ImsServices posibles que están precargados en el dispositivo y se vinculará a hasta dos ImsServices por ranura SIM (un ImsService para cada característica) en el siguiente orden por característica:

  1. El nombre del paquete ImsService definido por el valor de CarrierConfig config_ims_[mmtel/rcs]_package_override_string cuando hay una tarjeta SIM insertada.
  2. El nombre del paquete ImsService definido en el valor de superposición del dispositivo para config_ims_[mmtel/rcs]_package incluido el caso en el que no hay ninguna tarjeta SIM insertada. Este ImsService DEBE admitir la función Emergency MmTel.

Debe tener el nombre del paquete de su ImsService definido en CarrierConfig para cada uno de los operadores que utilizarán ese paquete o en la superposición del dispositivo si su ImsService será el predeterminado, como se define anteriormente.

Analicemos esto para cada característica. Para un dispositivo (simple o multi-SIM) con una sola tarjeta SIM cargada, son posibles dos funciones IMS: MMTel y RCS. El marco intentará vincularse en el orden definido anteriormente para cada función y, si la función no está disponible para el ImsService definido en la anulación de la configuración del operador, el marco recurrirá a su ImsService predeterminado. Entonces, por ejemplo, la siguiente tabla describe qué característica de IMS utilizará el marco dadas tres aplicaciones de IMS que implementan ImsServices instaladas en un sistema con las siguientes características:

  • El operador A ImsService admite RCS
  • Carrier B ImsService admite RCS y MMTel
  • OEM ImsService admite RCS y MMTel
Tarjeta SIM insertada Función RCS Función MMTel
Transportista A Transportista A OEM
Transportista B Transportista B Transportista B
Sin SIM OEM OEM

Validación

No se incluyen herramientas para verificar la implementación del IMS en sí, ya que las especificaciones del IMS son extremadamente extensas y utilizan equipos de verificación especiales. Las pruebas solo pueden verificar que el marco de telefonía responde correctamente a la API ImsService.

Desarrollar una aplicación IMS

Al desarrollar una aplicación IMS que interactúe con la pila de telefonía de Android, recomendamos especificar que la aplicación puede escuchar o modificar el estado de la instancia de ImsService adjunta para una suscripción de operador específica.

Para escuchar o modificar el estado de ImsService para las funciones MMTEL y RCS, use la clase ImsManager para obtener una instancia de la clase ImsMmTelManager , ImsRcsManager o ProvisioningManager específica de IMS. Luego, la aplicación puede escuchar estados de aprovisionamiento y servicios específicos de IMS, como:

  • Funciones MMTEL o RCS que están habilitadas y disponibles
  • Actualizaciones cuando cambia el estado de registro de IMS
  • Estado de aprovisionamiento de funciones IMS
  • Funciones de IMS que el usuario ha habilitado

Utilice ImsStateCallback

Aunque ImsService es un servicio vinculado persistentemente, el servicio vinculado puede cambiar cuando se activa una nueva tarjeta SIM o una suscripción integrada o cuando cambia la configuración de un operador. Debido a que ImsService no es parte del proceso de telefonía, una aplicación puede experimentar excepciones imprevistas al intentar acceder a las API de IMS si ImsService falla de manera invisible o no está vinculada debido a una suscripción o un cambio de configuración.

En dispositivos con Android 13 o superior, para monitorear si la instancia ImsService para una suscripción asociada está disponible o no, una aplicación puede usar la clase ImsStateCallback . Al obtener una instancia de ImsMmTelManager o ImsRcsManager , recomendamos que la aplicación se registre primero para una devolución de llamada de estado de IMS mediante ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback . Para continuar recibiendo actualizaciones de devoluciones de llamadas para suscripciones específicas cuando ImsService vuelva a estar disponible, la aplicación debe cancelar el registro o descartar las devoluciones de llamadas existentes registradas a través de ImsMmTelManager , ImsRcsManager o ProvisioningManager ; y registrar nuevas devoluciones de llamada.

Si hay una suscripción que no admite IMS, el marco llama a ImsStateCallback#onUnavailable con el motivo REASON_NO_IMS_SERVICE_CONFIGURED . Esto significa que ImsService y las API relacionadas con IMS no están disponibles para la suscripción.

En el improbable caso de que el proceso de telefonía falle, la aplicación recibe ImsStateCallback#onError y ya no recibe actualizaciones en la instancia registrada ImsStateCallback . Para recuperarse de esta condición, vuelva a registrar la instancia ImsStateCallback para la suscripción asociada llamando a ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback .