Android 9 presenta una interfaz de 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 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 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 con el SDK de Android en lugar de con la fuente. Una app de IMS preinstalada en el dispositivo también se puede configurar 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 del IMS se realiza completamente en el procesador de la app o si se descarga parcial o totalmente en el módem. Android no proporciona una HAL pública para la descarga en el procesador de banda base, por lo que cualquier descarga debe realizarse con la extensión de HAL para el módem.
Compatibilidad con implementaciones de IMS anteriores
Si bien Android 9 incluye la API de ImsService, los dispositivos que usan una implementación anterior para IMS no pueden admitir la API.
En el caso de estos dispositivos, las interfaces AIDL y las clases wrapper más antiguas 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 seguir admitiendo 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
android.telephony.ims.compat.ImsService
del filtro de intents 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 implementa un ImsService con el framework. En primer lugar, la implementación de ImsService debe registrarse en la plataforma con el AndroidManifest.xml
de la app; en segundo lugar, debe definir qué funciones de IMS admite la implementación (MmTel o RCS); y, en tercer lugar, debe verificarse como la implementación de IMS de confianza en la configuración del operador o en la superposición del dispositivo.
Definición del servicio
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 de service
en AndroidManifest.xml
define los siguientes atributos, que son necesarios para el funcionamiento correcto:
directBootAware="true"
: Permite quetelephony
descubra y ejecute el servicio antes de que el usuario desbloquee el dispositivo. El servicio no puede acceder al almacenamiento encriptado por dispositivo antes de que el usuario desbloquee el dispositivo. Para obtener más información, consulta Cómo admitir el modo de inicio directo y 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 al que se le haya otorgado el permisoBIND_IMS_SERVICE
pueda vincularse a la app. Esto evita que una app no autorizada se vincule al servicio, ya que solo las apps del sistema pueden obtener 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, 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, sigue siendo ventajoso declararlo como una función del ImsService.
A continuación, se indican 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 incluye compatibilidad con todos los medios de IMS (especificaciones IR.92 e 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 clase base android.telephony.ims.MmTelFeature
y devolver una implementación de MmTelFeature
personalizada en ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Declarar esta función solo indica a la plataforma que es posible adjuntar la PDN de IMS para los servicios de emergencia. Si esta función no se declara para tu ImsService
, la plataforma siempre usará la conmutación a modo de circuito de respaldo para los servicios de emergencia. La función FEATURE_MMTEL
debe definirse para que esta función se defina.
FEATURE_RCS
La API de ImsService no implementa ninguna función de IMS RCS, pero la clase base android.telephony.ims.RcsFeature
puede seguir siendo ú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 RCS, el framework llama automáticamente a RcsFeature#onFeatureRemoved
y, luego, limpia el ImsService
asociado con la función de RCS. Esta función 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á el ImsService, llamará a ImsService#create[...]Feature
para cada función de la que será responsable el ImsService. Si cambian las funciones que admite la app del IMS, puedes usar ImsService#onUpdateSupportedImsFeatures
para indicarle al framework que vuelva a calcular las funciones admitidas. 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 se haya definido correctamente el ImsService en AndroidManifest.xml, la plataforma debe configurarse para vincularse (de forma segura) al ImsService cuando corresponda. 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 vinculan cuando se inserta una tarjeta SIM coincidente. Esto se configura con el parámetro
config_ims_mmtel_package_override_string
Es la clave de CarrierConfig para ImsServices que implementa funciones de MMTEL.config_ims_rcs_package_override_string
para ImsServices que implementan funciones de RCS.
- ImsService "predeterminado" del dispositivo: Es el ImsService predeterminado que un OEM carga en el dispositivo y que debe diseñarse para proporcionar servicios IMS en todas las situaciones en las que no haya 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 MMTELconfig_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 que se definan aquí deben ser apps del sistema y 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). Al verificar si el nombre del paquete de la implementación del IMS coincide con los valores de CarrierConfig o de la 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 se configuran como el ImsService de "anulación" del operador o las configuraciones de ImsService "predeterminadas" del dispositivo para la funcionalidad de MMTEL o RCS.
El ImsService también permite que las funciones de IMS que admite (MMTEL y RCS) se habiliten o inhabiliten de forma dinámica con actualizaciones a través del método ImsService#onUpdateSupportedImsFeatures
. Esto activa el marco de trabajo 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, el ImsService se desvinculará hasta que se reinicie el teléfono o se inserte una nueva tarjeta SIM 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 precargan en el dispositivo y se vinculará a un máximo de dos ImsServices por ranura de SIM (un ImsService para cada función) en el siguiente orden por función:
- Nombre del paquete de ImsService definido por el valor de CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
cuando hay una tarjeta SIM insertada. - Nombre del paquete ImsService definido en el valor de la 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 de MmTel de emergencia.
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 cada función. En el caso de un dispositivo (con una o varias SIM) que tenga cargada una sola tarjeta SIM, se pueden usar dos funciones de IMS: MMTel y RCS. El framework intentará realizar la vinculación 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 Carrier Configuration, el framework recurrirá a tu ImsService predeterminado. Por ejemplo, la siguiente tabla describe qué función del 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
- ImsService del OEM admite RCS y MMTel
Se insertó la tarjeta SIM | Función de RCS | Función de MMTel |
---|---|---|
Empresa de transporte A | Empresa de transporte A | OEM |
Operador B | Operador B | Operador B |
No hay ninguna tarjeta 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 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 se 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 clase ImsManager
para obtener una instancia de la clase ImsMmTelManager
, ImsRcsManager
o ProvisioningManager
específica de IMS. Luego, la app puede escuchar los estados de aprovisionamiento y servicio específicos del IMS, como los siguientes:
- Funciones de MMTEL o RCS habilitadas y disponibles
- Se actualiza cuando cambia el estado de registro de IMS
- Estado de aprovisionamiento de las funciones de IMS
- Funciones de IMS que habilitó el usuario
Cómo usar ImsStateCallback
Aunque ImsService es un servicio vinculado de forma persistente, el servicio vinculado puede cambiar cuando se activa una nueva tarjeta SIM o una suscripción integrada, o cuando cambia la configuración del operador. Dado que ImsService no forma parte del proceso de telefonía, es posible que una app experimente excepciones imprevistas cuando intente 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 que ejecutan Android 13 o versiones posteriores, para supervisar si la instancia de ImsService de una suscripción asociada está disponible o no, una app puede usar la clase ImsStateCallback
. 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 devoluciones 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 a 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 sobre la instancia de ImsStateCallback
registrada.
Para recuperarse de esta condición, vuelve a registrar la instancia de ImsStateCallback
para la suscripción asociada llamando a ImsMmTelManager#registerImsStateCallback
o ImsRcsManager#registerImsStateCallback
.