Android 9 presenta una nueva 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 que proporciona el proveedor o el proveedor.
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 Android, lo que significa que se puede compilar directamente en el SDK de Android en lugar de hacerlo en la fuente. Una app de IMS que se haya preinstalado en el dispositivo también se puede configurar para que se pueda actualizar en Play Store.
Ejemplos y fuente
Android proporciona una app en AOSP que implementa partes de la API de ImsService con 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 se encuentra completamente en el procesador de apps o si se descarga de forma parcial o total en el módem. Android no proporciona una HAL pública para transferir cargas al procesador de banda base, por lo que cualquier transferencia debe realizarse con la extensión de 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 de IMS no pueden admitir la API.
En estos dispositivos, las interfaces y clases de wrapper de AIDL más antiguas se movieron al espacio de nombres android.telephony.ims.compat
. Cuando se actualiza a Android 9, los dispositivos más antiguos deben hacer lo siguiente para mantener la compatibilidad de la API anterior.
- Cambia el espacio de nombres de la implementación de ImsService para que se extienda desde la API de 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 funcionar 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 requieren tres pasos para registrar una app que implementa un ImsService con el framework. Primero, la implementación de ImsService debe registrarse en la plataforma mediante 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 proveedor o 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 el dispositivo antes de que el usuario lo desbloquee. 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 con la app. De esta manera, se evita que una app fraudulenta se vincule con el servicio, ya que el framework solo puede otorgar el permiso a las apps del sistema.
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 funciones del IMS
Después de que ImsService se define 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. Sin embargo, solo MmTel está integrada en el framework. Aunque no hay APIs de RCS integradas en el framework, aún existen ventajas para 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, y 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 admite 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 mostrar una implementación personalizada de MmTelFeature
en ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Declarar esta función solo le indica a la plataforma que es posible la conexión de emergencia a la PDN de IMS para los servicios de emergencia. Si no se declara esta función para tu ImsService
, la plataforma siempre usará el resguardo de interruptor de circuito 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 otro modo, tendría que proporcionar una función de RCS.
Registro de las funciones compatibles
El framework de telefonía se vincula primero a ImsService para consultar las funciones que admite con la API de ImsService#querySupportedImsFeatures
. Después de que el framework calcule 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 del 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 se haya definido correctamente el ImsService en AndroidManifest.xml, la plataforma se debe configurar para vincularse (de forma segura) al ImsService cuando corresponda. El framework se vincula a los siguientes dos tipos de ImsServices:
- ImsService de "anulación" del operador: Estos ImsServices se precargan 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 uso de
config_ims_mmtel_package_override_string
CarrierConfig para ImsServices que implementan funciones de MMTEL.config_ims_rcs_package_override_string
para ImsServices que implementa funciones de RCS.
- ImsService "predeterminado" del dispositivo: 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 hay un ImsService del operador disponible y es útil en situaciones en las que el dispositivo no tiene una tarjeta SIM insertada o la tarjeta SIM insertada no tiene un ImsService del operador instalado. 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 cualquier implementación de ImsService que se defina aquí debe ser una app del sistema y debe 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). Cuando se verifica si el nombre del paquete de la implementación de IMS coincide con los valores de CarrierConfig o de la superposición del dispositivo definidos anteriormente, solo se vinculan las apps preinstaladas de confianza.
Personalización
Las apps que implementan un ImsService solo se vinculan en dispositivos en los que se configuran como la configuración de ImsService de "anulación" del operador o la configuración de ImsService "predeterminada" 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 mediante actualizaciones que usan 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 no se vinculará 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 admite 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:
- Es el nombre de paquete de ImsService definido por el valor
config_ims_[mmtel/rcs]_package_override_string
de CarrierConfig cuando se inserta una tarjeta SIM. - 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 una tarjeta SIM insertada Este ImsService DEBE admitir la función 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 esto para cada atributo. Para un dispositivo (una o varias SIM) con una sola tarjeta SIM cargada, hay dos funciones de IMS posibles: 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 configuración del operador, el framework recurrirá a tu ImsService predeterminado. Por ejemplo, en la siguiente tabla, se describe qué función de IMS usará el framework en función de tres apps de IMS que implementan ImsServices instalado en un sistema con las siguientes funciones:
- El ImsService del operador A admite RCS
- ImsService del operador B admite RCS y MMTel.
- ImsService de OEM es compatible con RCS y MMTel
Tarjeta SIM insertada | Función RCS | Función de MMTel |
---|---|---|
Operador A | Operador A | OEM |
Proveedor B | Proveedor B | Operador B |
No hay ninguna tarjeta SIM | OEM | OEM |
Validación
No se incluyen herramientas para verificar la implementación del IMS, ya que las especificaciones del IMS son muy 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 pueda escuchar o modificar el estado de la instancia de ImsService que se adjunta para una suscripción a un operador específico.
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 estados de servicio y aprovisionamiento específicos del IMS, como los siguientes:
- Funciones de MMTEL o RCS que están 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 el usuario habilitó
Usa 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 incorporada, o cuando cambia la configuración de un operador. Debido a 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 una suscripción o un cambio de configuración.
En dispositivos que ejecutan 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 clase ImsStateCallback
. Cuando obtienes 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 devoluciones de llamada nuevas.
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 caso improbable de que falle el proceso de telefonía, la app recibe ImsStateCallback#onError
y ya no recibe actualizaciones en la instancia de ImsStateCallback
registrada.
Para recuperarte de esta condición, vuelve a registrar la instancia ImsStateCallback
de la suscripción asociada llamando a ImsMmTelManager#registerImsStateCallback
o ImsRcsManager#registerImsStateCallback
.