Implementando SGI

Android 9 presenta una nueva interfaz SystemApi llamada ImsService para ayudarlo a implementar el subsistema multimedia IP (IMS). La API de 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

Mediante el uso de la interfaz de 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 de MmTel para proporcionar llamadas de voz y video. La API de ImsService también es una API del sistema Android, lo que significa que se puede compilar contra el SDK de Android directamente en lugar de contra la fuente. Una aplicación IMS que ha 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 de ImsService con fines de prueba y desarrollo. Puede encontrar la aplicación en /testapps/ImsTestService .

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

Implementación

La API de 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 una HAL pública para la descarga al procesador de banda base, por lo que cualquier descarga debe ocurrir usando su extensión HAL al módem.

Compatibilidad con implementaciones IMS anteriores

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

  • Cambie el espacio de nombres de la implementación de ImsService para que se extienda 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 intenciones android.telephony.ims.compat.ImsService , en lugar de la acción android.telephony.ims.ImsService .

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

Registro de ImsService con el marco

La API de 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 usando el AndroidManifest.xml de la aplicación; segundo, debe definir qué funciones de IMS admite la implementación (MmTel o RCS); y tercero, debe verificarse como la implementación de IMS de confianza, 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 de 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 del service en AndroidManifest.xml define los siguientes atributos, que son necesarios para el correcto funcionamiento:

  • directBootAware="true" : permite que el servicio sea descubierto y ejecutado 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 desbloquee el dispositivo. Para obtener más información, consulte Compatibilidad con el modo de inicio directo y el 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 SOLO funciona si la aplicación se crea como una aplicación del sistema.
  • permission="android.permission.BIND_IMS_SERVICE" : Garantiza que solo un proceso al que se le ha otorgado el permiso BIND_IMS_SERVICE puede vincularse a la aplicación. Esto evita que una aplicación maliciosa se vincule al servicio, ya que el marco solo puede otorgar el 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 de IMS

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

A continuación se encuentran las funciones válidas definidas en android.telephony.ims.ImsFeature que 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 función, esta página describe cómo ImsService declara el conjunto de funciones que define para cada ranura SIM.

CARACTERÍSTICA_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 de MMTEL debe ampliar la clase base android.telephony.ims.MmTelFeature y devolver una implementación personalizada de MmTelFeature en ImsService#createMmTelFeature .

FEATURE_EMERGENCY_MMTEL

La declaración de esta función solo indica a la plataforma que es posible una conexión de emergencia al IMS PDN para servicios de emergencia. Si esta característica no está declarada para su ImsService , la plataforma siempre usará de manera predeterminada el circuito alternativo para los servicios de emergencia. La función FEATURE_MMTEL debe estar definida para que se defina esta función.

CARACTERÍSTICA_RCS

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

Registro de funciones compatibles

El marco de telefonía primero se vincula con ImsService para consultar las funciones que admite mediante la API de 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 funciones que admite la aplicación IMS cambian, puede usar ImsService#onUpdateSupportedImsFeatures para indicarle al marco que vuelva a calcular las funciones admitidas. Consulte el siguiente diagrama para obtener más información sobre la inicialización y el enlace de ImsService.

ImsService inicializando y vinculando

Figura 2: Inicialización y vinculación de ImsService

Marco de detección y verificación 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) con ImsService cuando corresponda. Hay dos tipos de ImsServices a los que se vincula el marco:

  1. El operador "anula" ImsService: Estos ImsServices están precargados en el dispositivo, pero están conectados a uno o más operadores celulares y solo se vincularán cuando se inserte una tarjeta SIM correspondiente. Esto se configura mediante 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 operador ImsService no está disponible y es útil en situaciones donde el dispositivo no tiene tarjeta SIM insertada o la tarjeta SIM insertada no tiene instalado ImsService de un operador. Esto se define en la superposición del dispositivo mediante las siguientes configuraciones:

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

personalización

Las aplicaciones que implementan un ImsService solo están vinculadas a dispositivos en los que están configurados como el ImsService "anulado" del operador o las configuraciones ImsService "predeterminadas" del dispositivo para la funcionalidad MMTEL o RCS. ImsService también permite que las funciones de IMS que admite (MMTEL y RCS) se habiliten o deshabiliten dinámicamente a través de actualizaciones mediante el método ImsService#onUpdateSupportedImsFeatures . Esto activa el marco para volver 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 de enlace 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 vinculará hasta dos ImsServices por ranura SIM (un ImsService para cada función) en el siguiente orden por función:

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

Debe tener el nombre del paquete de su ImsService definido en CarrierConfig para cada uno de los transportistas que usarán ese paquete o en la superposición del dispositivo si su ImsService será el predeterminado, como se definió 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é función de IMS utilizará el marco dadas tres aplicaciones de IMS que implementan ImsServices instaladas en un sistema con las siguientes funciones:

  • Carrier A ImsService es compatible con RCS
  • Carrier B ImsService es compatible con RCS y MMTel
  • OEM ImsService es compatible con RCS y MMTel
Tarjeta SIM insertada Característica RCS Función MMTel
Transportista A Transportista A OEM
Transportista B Transportista B Transportista B
Sin SIM OEM OEM

Validación

Las herramientas para verificar la implementación de IMS en sí no están incluidas ya que las especificaciones de IMS son extremadamente grandes y utilizan equipos de verificación especiales. Las pruebas solo pueden verificar que el marco de telefonía responda correctamente a la API de ImsService.

Desarrollar una aplicación IMS

Al desarrollar una aplicación de 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 que se adjunta para una suscripción de operador específica.

Para escuchar o modificar el estado de ImsService para funciones de MMTEL y RCS, utilice la clase ImsManager para obtener una instancia de la ImsMmTelManager , ImsRcsManager o ProvisioningManager específica de IMS. Luego, la aplicación puede escuchar el servicio específico de IMS y los estados de aprovisionamiento, 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 de IMS
  • Funciones de IMS que el usuario ha habilitado

Usar 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 forma 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 forma invisible o se desvincula debido a una suscripción o un cambio de configuración.

En dispositivos con Android 13 o superior, para monitorear si la instancia de 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 primero se registre para una devolución de llamada de estado de IMS mediante ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback . Para continuar recibiendo actualizaciones de devolución de llamada para suscripciones específicas cuando ImsService vuelva a estar disponible, la aplicación debe anular el registro o descartar las devoluciones de llamada existentes registradas a través de ImsMmTelManager , ImsRcsManager o ProvisioningManager ; y registrar nuevas devoluciones de llamada.

Si hay una suscripción que no es compatible con 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 se bloquee, la aplicación recibe ImsStateCallback#onError y ya no recibe actualizaciones en la instancia de ImsStateCallback registrada. Para recuperarse de esta condición, vuelva a registrar la instancia de ImsStateCallback para la suscripción asociada llamando a ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback .