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

Figura 1: Descripción general de ImsService
Con 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 a través de IMS y la integración de funciones de MmTel para proporcionar llamadas de voz y video. La API de ImsService también es una API del sistema de Android, lo que significa que se puede compilar directamente en el SDK de Android en lugar de hacerlo en la fuente. También se puede configurar una app de IMS que se haya instalado previamente en el dispositivo para que se pueda actualizar desde Play Store.
Ejemplos y fuente
Android proporciona una app en AOSP que implementa partes de la API de ImsService para fines de prueba y desarrollo. Puedes encontrar la app en /testapps/ImsTestService.
Puedes encontrar la documentación de 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 te permite implementar IMS de muchas maneras, según el hardware disponible. Por ejemplo, la implementación cambia según si la implementación de IMS está completamente en el procesador de la app o si se descarga de forma parcial o completa al módem. Android no proporciona una HAL pública para la descarga al procesador de banda base, por lo que cualquier descarga debe realizarse con la extensión HAL al módem.
Compatibilidad con implementaciones de IMS anteriores
Aunque Android 9 incluye la API de ImsService, los dispositivos que usan una implementación anterior para IMS no pueden admitir la API.
Para estos dispositivos, las interfaces AIDL y las clases de wrapper anteriores se movieron al espacio de nombres android.telephony.ims.compat. Cuando se actualizan a Android 9, los dispositivos más antiguos deben hacer lo siguiente para continuar con la compatibilidad de la API anterior.
- Cambia 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. - Modifica la definición del servicio ImsService en AndroidManifest.xml para usar la acción de filtro de intents
android.telephony.ims.compat.ImsService, en lugar de la acciónandroid.telephony.ims.ImsService.
Luego, el framework se vinculará a ImsService con la capa de compatibilidad proporcionada en Android 9 para trabajar con la implementación heredada de ImsService.
Registro de ImsService con el framework
La API de ImsService se implementa como un servicio al que se vincula el framework de Android para comunicarse con la implementación de IMS. Se necesitan tres pasos para registrar una app que implemente un ImsService con el framework. Primero, la implementación de ImsService debe registrarse en la plataforma con el AndroidManifest.xml de la app; 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 en la configuración del operador o la superposición del dispositivo.
Definición de Service
La app de IMS registra un ImsService con el framework agregando una entrada service al manifiesto con 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 funcionamiento correcto:
directBootAware="true": Permite quetelephonydescubra y ejecute el servicio antes de que el usuario desbloquee el dispositivo. El servicio no puede acceder al almacenamiento encriptado del dispositivo antes de que el usuario lo desbloquee. Para obtener más información, consulta Admite el modo de inicio directo y la encriptación basada en archivos.persistent="true": Permite que este servicio se ejecute de forma persistente y que el sistema no lo cierre para recuperar memoria. Este atributo SOLO funciona si la app se compila como una app del sistema.permission="android.permission.BIND_IMS_SERVICE": Garantiza que solo un proceso que haya recibido el permisoBIND_IMS_SERVICEpueda vincularse a la app. Esto evita que una app no autorizada se vincule al servicio, ya que solo las apps del sistema pueden recibir el permiso del framework.
El servicio también debe especificar el elemento intent-filter con la acción android.telephony.ims.ImsService. Esto permite que el framework encuentre el ImsService.
Especificación de la función 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 admite las funciones de MmTel y RCS, pero solo MmTel está integrado en el framework. Aunque no hay APIs de RCS integradas en el framework, aún existen ventajas de declararlo como una función de ImsService.
A continuación, se muestran las funciones válidas definidas en android.telephony.ims.ImsFeature que puede proporcionar un ImsService, además de una explicación y un ejemplo de por qué una app de IMS querría implementar una o todas estas funciones. Después de definir cada función, en esta página, se describe cómo ImsService declara el conjunto de funciones que define para cada ranura de SIM.
FEATURE_MMTEL
ImsService implementa la función MMTEL de IMS, que contiene compatibilidad con todos los medios de IMS (especificaciones IR.92 y IR.94), excepto la conexión de emergencia a la PDN de IMS para llamadas de emergencia. Cualquier implementación de ImsService que desee
admitir las funciones de MMTEL debe extender la
android.telephony.ims.MmTelFeature clase base y mostrar una implementación personalizada de
MmTelFeature en
ImsService#createMmTelFeature.
FEATURE_EMERGENCY_MMTEL
Declarar esta función solo indica a la plataforma que es posible la conexión de emergencia a la PDN de IMS para los servicios de emergencia. Si esta función no se declara para tu ImsService, la plataforma siempre usará el fallback de conmutación de circuitos para los servicios de emergencia. Se debe definir la función FEATURE_MMTEL para que se defina esta función.
FEATURE_RCS
La API de ImsService no implementa ninguna función de RCS de IMS, pero la clase base android.telephony.ims.RcsFeature puede ser útil. El framework se vincula automáticamente a ImsService y llama a ImsService#createRcsFeature cuando detecta que el paquete debe proporcionar RCS. Si se quita la tarjeta SIM asociada con el servicio de RCS, el framework llama automáticamente a RcsFeature#onFeatureRemoved y, luego, limpia el ImsService asociado con la función de RCS. Esta funcionalidad puede quitar parte de la lógica de detección o vinculación personalizada que, de lo contrario, tendría que proporcionar una función de RCS.
Registro de funciones compatibles
Primero, el framework de telefonía se vincula a ImsService para consultar las funciones que admite con la API de ImsService#querySupportedImsFeatures. Después de que el framework calcula qué funciones admitirá ImsService, llamará a ImsService#create[...]Feature para cada función de la que será responsable ImsService. Si cambian las funciones que admite la app de IMS, puedes usar ImsService#onUpdateSupportedImsFeatures para indicarle al framework que vuelva a calcular las funciones compatibles. Consulta el siguiente diagrama para obtener más información sobre la inicialización y la vinculación de ImsService.
Figura 2: Inicialización y vinculación de ImsService
Detección y verificación del framework de una implementación de ImsService
Una vez que ImsService se haya definido correctamente en AndroidManifest.xml, se debe configurar la plataforma para que se vincule (de forma segura) a ImsService cuando sea apropiado. Existen dos tipos de ImsServices a los que se vincula el framework:
- ImsService de "anulación" del operador: Estos ImsServices se cargan previamente en el dispositivo, pero se adjuntan a uno o más operadores de telefonía celular y solo se vincularán cuando se inserte una tarjeta SIM coincidente. Esto se configura con
config_ims_mmtel_package_override_stringla clave CarrierConfig para ImsServices que implementan funciones de MMTELconfig_ims_rcs_package_override_stringpara ImsServices que implementan funciones de RCS
- ImsService "predeterminado" del dispositivo: Este es el ImsService predeterminado que un OEM carga en el dispositivo y debe diseñarse para proporcionar servicios de IMS en todas las situaciones en las que no esté disponible un ImsService del operador. Es útil en situaciones en las que el dispositivo no tiene una tarjeta SIM insertada o la tarjeta SIM insertada no tiene instalado un ImsService del operador. Esto se define en la superposición del dispositivo con las siguientes configuraciones:
config_ims_mmtel_package: Implementa funciones de MMTEL.config_ims_rcs_package: Implementa funciones de RCS.
Android no admite apps con implementaciones de ImsService descargables de terceros, por lo que todas las implementaciones de ImsService definidas aquí deben ser apps del sistema y deben residir en la carpeta /system/priv-app/ o /product/priv-app/ para otorgar los permisos adecuados (es decir, permisos de teléfono, micrófono, ubicación, cámara y contactos). Si verificas 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 apps de confianza preinstaladas.
Personalización
Las apps que implementan un ImsService solo se vinculan en dispositivos en los que están configuradas como las configuraciones de ImsService de "anulación" del operador o de ImsService "predeterminado" del dispositivo para la funcionalidad de MMTEL o RCS.
ImsService también permite que las funciones de IMS que admite (MMTEL y RCS) se habiliten o inhabiliten de forma dinámica con actualizaciones mediante el método ImsService#onUpdateSupportedImsFeatures. Esto activa el framework para que vuelva a calcular qué ImsServices están vinculados y qué funciones admiten. Si la app de IMS actualiza el framework sin funciones compatibles, ImsService se desvinculará hasta que se reinicie el teléfono o se inserte una tarjeta SIM nueva que coincida con la app de IMS.
Prioridad de vinculación para varios ImsService
El framework no puede admitir la vinculación a todos los ImsServices posibles que se cargan previamente en el dispositivo y se vinculará a hasta dos ImsServices por ranura de SIM (un ImsService para cada función) en el siguiente orden por función:
- El nombre del paquete de ImsService definido por el valor CarrierConfig
config_ims_[mmtel/rcs]_package_override_stringcuando se inserta una tarjeta SIM. - 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 se inserta ninguna tarjeta SIM. Este ImsService DEBE admitir la función Emergency MmTel.
Debes tener el nombre del paquete de tu ImsService definido en CarrierConfig para cada uno de los operadores que usarán ese paquete o en la superposición del dispositivo si tu ImsService será el predeterminado, como se definió anteriormente.
Analicemos esto para cada función. Para un dispositivo (con una o varias SIM) con una sola tarjeta SIM cargada, son posibles dos funciones de IMS: MMTel y RCS. El framework 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 framework volverá a tu ImsService predeterminado. Por ejemplo, en la siguiente tabla, se describe qué función de IMS usará el framework, dadas tres apps de IMS que implementan ImsServices instaladas en un sistema con las siguientes funciones:
- El ImsService del operador A admite RCS.
- El ImsService del operador B admite RCS y MMTel.
- El ImsService del OEM admite RCS y MMTel.
| Tarjeta SIM insertada | Función de RCS | Función de MMTel |
|---|---|---|
| Operador A | Operador A | OEM |
| Operador B | Operador B | Operador B |
| No hay ninguna tarjeta 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 usan equipos de verificación especiales. Las pruebas solo pueden verificar que el framework de telefonía responda correctamente a la API de ImsService.
Desarrolla una app de IMS
Cuando desarrolles una app de IMS que interactúe con la pila de telefonía de Android, te recomendamos que especifiques que la app puede escuchar o modificar el estado de la instancia de ImsService que está adjunta para una suscripción de operador específica.
Para escuchar o modificar el estado de ImsService para las funciones de MMTEL y RCS, usa
la
claseImsManager
para obtener una instancia de la
claseImsMmTelManager,
claseImsRcsManager,
o
claseProvisioningManager
específica de IMS. Luego, la app puede escuchar estados de aprovisionamiento y servicio específicos de IMS, como los siguientes:
- Funciones de MMTEL o RCS que están habilitadas y disponibles
- Actualizaciones cuando cambia el estado de registro de IMS
- Estado de aprovisionamiento de las funciones de IMS
- Funciones de IMS que habilitó el usuario
Usa ImsStateCallback
Aunque ImsService es un servicio vinculado de forma persistente, el servicio vinculado puede cambiar cuando se activa una nueva tarjeta SIM o suscripción incorporada, o cuando cambia la configuración del operador. Debido a que ImsService no forma parte del proceso de telefonía, una app puede experimentar excepciones imprevistas cuando intenta acceder a las APIs de IMS si ImsService falla de forma invisible o se desvincula debido a un cambio de suscripción o configuración.
En dispositivos con Android 13 o versiones posteriores, para supervisar
si la instancia de ImsService para una suscripción asociada está
disponible o no, una app puede usar la
ImsStateCallback
clase. Cuando obtengas una instancia de ImsMmTelManager o ImsRcsManager, te
recomendamos que la app primero se registre para una devolución de llamada de estado de IMS con
ImsMmTelManager#registerImsStateCallback
o
ImsRcsManager#registerImsStateCallback.
Para seguir recibiendo actualizaciones de devolución de llamada para suscripciones específicas cuando ImsService vuelva a estar disponible, la app 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 admite IMS, el framework llama
ImsStateCallback#onUnavailable
con el motivo
REASON_NO_IMS_SERVICE_CONFIGURED.
Esto significa que ImsService y las APIs relacionadas con IMS no están disponibles para la suscripción.
En el improbable caso de que falle el proceso de telefonía, la app recibe
ImsStateCallback#onError
y ya no recibe actualizaciones en la instancia ImsStateCallback registrada.
Para recuperarte de esta condición, vuelve a registrar la instancia ImsStateCallback para
la suscripción asociada llamando a
ImsMmTelManager#registerImsStateCallback
o
ImsRcsManager#registerImsStateCallback.