Implementar IMS

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

Descripción general de ImsService

Figura 1: Descripción general de ImsService

Con la interfaz de ImsService, el implementador de IMS puede proporcionar que señalan información a la plataforma, como información de registro de IMS, SMS, a través de IMS y la función de MmTel para proporcionar voz y video llamadas. La API de ImsService también es una API del sistema Android, lo que significa que puede se compiló directamente con el SDK de Android en lugar de con la fuente. Un IMS que viene preinstalada en el dispositivo también se puede configurar para que se pueda actualizar Play Store.

Ejemplos y fuente

Android proporciona una app en AOSP que implementa partes de la 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 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 se encuentra completamente en la app o si se descargó de forma parcial o total en el módem. Android no proporcionan una HAL pública para la descarga en el procesador de banda base, por lo que la descarga debe producirse mediante 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 antigua para IMS no son compatibles con la API. Para estos dispositivos, se trasladaron las interfaces y las clases de wrapper anteriores del AIDL. al espacio de nombres android.telephony.ims.compat. Si actualizas a Android 9, los dispositivos más antiguos deben hacer lo siguiente para continuar la compatibilidad de la API anterior.

  • Cambiar el espacio de nombres de la implementación de ImsService para que se extienda desde API de espacio de nombres android.telephony.ims.compat.
  • Modifica la definición del servicio ImsService en AndroidManifest.xml para usar el android.telephony.ims.compat.ImsService acción de filtro de intents, en lugar de la acción android.telephony.ims.ImsService.

El framework se vinculará con ImsService mediante la capa de compatibilidad. que se proporcionan en Android 9 para trabajar con la versión Implementación de ImsService.

Registro de ImsService con el framework

La API de ImsService se implementa como un servicio, y el framework de Android enlaza para poder comunicarse con la implementación de IMS. Tres pasos son necesario para registrar una app que implementa un ImsService con el en un framework de aplicaciones. Primero, la implementación de ImsService debe registrarse con el plataforma con el AndroidManifest.xml de la app; Segundo, debe definir qué funciones de IMS admite la implementación (MmTel o RCS) y tercero, Se debe verificar como implementación de IMS de confianza en el operador configuración o la superposición de dispositivos.

Definición del servicio

La app de IMS registra un ImsService con el framework agregando un service en el 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 lo siguiente: atributos, que son necesarios para el funcionamiento correcto:

  • directBootAware="true": Permite que el servicio sea descubierto y ejecutado por telephony antes de que el usuario desbloquee el dispositivo. El servicio no tiene acceso encriptado por el dispositivo antes de que el usuario lo desbloquee. Para ver más información, consulta Compatibilidad con el modo de inicio directo y Encriptación basada en archivos.
  • persistent="true": Permite que este servicio se ejecute de manera persistente y no se ejecute. que el sistema finaliza para recuperar memoria. Este atributo SOLO funciona si el se compila como una aplicación del sistema.
  • permission="android.permission.BIND_IMS_SERVICE": Garantiza que solo un elemento proceso al que se le otorgó el permiso BIND_IMS_SERVICE puede enlazarse con la app. Esto evita que una app fraudulenta se vincule a la servicio, ya que solo las aplicaciones del sistema pueden obtener el permiso en un framework de aplicaciones.

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

Especificación de la función de IMS

Una vez que ImsService se haya definido como un servicio de Android en AndroidManifest.xml, ImsService debe definir las funciones de IMS que admite. Actualmente, Android admite las funciones MmTel y RCS, pero solo MmTel está disponible. integrados en el framework. Aunque no hay APIs de RCS integradas en del framework, todavía existen ventajas si lo declaras como una función del ImsService.

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

FEATURE_MMTEL

ImsService implementa la función MMTEL de IMS, que es compatible con lo siguiente: todos los medios IMS (especificaciones IR.92 e IR.94), excepto la conexión de emergencia al PDN de IMS para llamadas de emergencia. Cualquier implementación de ImsService que desee admitir las funciones MMTEL deben extender el Clase base android.telephony.ims.MmTelFeature y muestra un valor personalizado Implementación de MmTelFeature en ImsService#createMmTelFeature

FEATURE_EMERGENCY_MMTEL

La declaración de esta función solo le indica a la plataforma que se conecta de emergencia al Es posible usar PDN de IMS para los servicios de emergencia. Si esta función no se declara en tu ImsService, la plataforma siempre se establecerá de forma predeterminada como resguardo de interruptor de circuito. para los servicios de emergencia. Para ello, se debe definir el atributo FEATURE_MMTEL el atributo que se debe definir.

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 marco de trabajo se vincula automáticamente a ImsService y llama a ImsService#createRcsFeature cuando detecte que el paquete debe proporcionar RCS. Si la tarjeta SIM asociada con el servicio de RCS, el framework llamará automáticamente RcsFeature#onFeatureRemoved y, luego, limpia el ImsService asociado con la función RCS. Esta función puede quitar algunos de los recursos de detección o vinculación que una función de RCS debería proporcionar.

Registro de funciones admitidas

El framework de telefonía primero se vincula con ImsService para consultar las funciones que admite con la API de ImsService#querySupportedImsFeatures. Después del framework calcula qué funciones admitirá ImsService, llamará ImsService#create[...]Feature para cada atributo que aplicará el ImsService responsable. Si cambian las funciones que la app de IMS admite, puedes usar ImsService#onUpdateSupportedImsFeatures para indicar que el framework volver a calcular las funciones admitidas. Consulta el siguiente diagrama para obtener más información sobre la inicialización y vinculación de ImsService.

Inicialización y vinculación de ImsService

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

Detección de framework y verificación de una implementación de ImsService

Cuando ImsService se haya definido correctamente en AndroidManifest.xml, el archivo debe configurarse para vincularse (de forma segura) a ImsService cuando lo que sea apropiado. El framework se vincula a los siguientes dos tipos de ImsServices:

  1. "Anulación" del proveedor ImsService: Estos ImsServices están precargados en la dispositivo, pero están conectadas a uno o más operadores de telefonía celular y solo se conectarán se vincula cuando se inserta una tarjeta SIM coincidente. Esto se configura con el
  2. Dispositivo “predeterminado” ImsService: Este es el ImsService predeterminado que se carga. al dispositivo por un OEM y debe estar diseñada para proporcionar servicios de IMS en en todas las situaciones en las que ImsService no está disponible y resulta útil para situaciones en las que el dispositivo no tiene una tarjeta SIM o la tarjeta SIM insertado no cuenta con un proveedor ImsService instalado. Este es definidos en la superposición de dispositivos con las siguientes configuraciones:

Android no admite apps con ImsService descargables de terceros por lo que cualquier implementación de ImsService definida aquí deben ser apps del sistema y deben residir en /system/priv-app/ o /product/priv-app/ para otorgar los permisos adecuados (p. ej., teléfono, los permisos del micrófono, la ubicación, la cámara y los contactos). Verificando si el nombre del paquete de la implementación del IMS coincide con el de CarrierConfig o el dispositivo los valores de superposición definidos anteriormente, solo se usan aplicaciones de confianza preinstaladas de un recurso.

Personalización

Las apps que implementan un ImsService solo se vinculan en dispositivos en los que están configurados como el proveedor "anular" ImsService o dispositivo “predeterminado” Configuraciones de ImsService para la funcionalidad de MMTEL o RCS. ImsService también permite que las funciones de IMS que admite (MMTEL y RCS) se habilitarse o inhabilitarse dinámicamente a través de actualizaciones mediante ImsService#onUpdateSupportedImsFeatures. Esto activa el framework para y vuelve a calcular qué ImsServices están vinculados y qué atributos admiten. Si el botón La app de IMS actualiza el framework sin funciones compatibles, el sistema ImsService se desvinculará hasta que se reinicie el teléfono o se inserte una tarjeta SIM nueva coincide 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 precargado en el dispositivo y se vinculará con hasta dos ImsServices por ranura de SIM (un ImsService por cada función) en el siguiente orden por función:

  1. El nombre del paquete de ImsService definido por el valor CarrierConfig config_ims_[mmtel/rcs]_package_override_string cuando hay una tarjeta SIM o insertarse.
  2. El nombre del paquete ImsService definido en el valor de superposición del dispositivo del config_ims_[mmtel/rcs]_packageincluido el caso en el que no hay ninguna SIM Se insertó la tarjeta. Este ImsService DEBE admitir la función MmTel de emergencia.

El nombre del paquete de tu ImsService debe estar definido en la CarrierConfig para cada una de las empresas de transporte que usarán ese paquete o en las superposición de dispositivos si tu ImsService será el predeterminado, como se definió más arriba.

Analicemos esto para cada atributo. Para un dispositivo (una o varias tarjetas SIM) Con una sola tarjeta SIM cargada, se pueden usar dos funciones de IMS: MMTel y RCS. El framework intentará vincularse en el orden definido previamente para cada función y si la función no está disponible para el ImsService definido en el proveedor Anulación de la configuración, el framework recurrirá a tu ImsService predeterminado. Por ejemplo, la siguiente tabla describe con qué función de IMS tendrá el marco se usan tres apps de IMS que implementan ImsServices instaladas en un sistema con las siguientes funciones:

  • El operador A ImsService admite RCS
  • El operador B ImsService admite RCS y MMTel
  • ImsService de OEM admite RCS y MMTel
Se insertó la tarjeta SIM Función RCS Función de MMTel
Proveedor A Proveedor A OEM
Proveedor B Proveedor B Proveedor B
No hay ninguna tarjeta SIM OEM OEM

Validación

Las herramientas para verificar la implementación propia de IMS no están incluidas, ya que el IMS son extremadamente extensas y usan un equipo de verificación especial. El solo pueden verificar que el framework de telefonía responda adecuadamente al la API de ImsService.

Desarrolla una app de IMS

Cuando desarrolles una app de IMS que se conecte con la pila de telefonía de Android, recomendamos especificar que la app puede escuchar o modificar el estado de la Instancia de ImsService que se adjunta para la suscripción de un operador específico.

Para escuchar o modificar el estado de ImsService para las funciones de MMTEL y RCS, usa el ImsManager para obtener una instancia del ImsMmTelManager: ImsRcsManager o específica de IMS ProvisioningManager clase. Luego, la app puede escuchar los estados de aprovisionamiento y servicio específicos de IMS. por ejemplo:

  • 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 el usuario habilitó

Usa ImsStateCallback

Aunque ImsService es un servicio vinculado de forma persistente, el servicio es posible que cambie cuando se active una nueva tarjeta SIM o suscripción incorporada o cuando cambia la configuración de un operador. Como ImsService no forma parte de la de telefonía, una app puede experimentar excepciones imprevistas cuando intente accedan a las APIs de IMS si ImsService falla de forma invisible o no se delimita debido a un cambio en la suscripción o la configuración.

En dispositivos con Android 13 o versiones posteriores, para supervisar si la instancia de ImsService para una suscripción asociada disponible o no disponible, una aplicación puede usar el ImsStateCallback clase. Cuando obtenemos una instancia de ImsMmTelManager o ImsRcsManager, recomendar que la app primero se registre para una devolución de llamada de estado de IMS usando ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback. Para seguir recibiendo actualizaciones sobre la devolución de llamada de suscripciones específicas cuando ImsService vuelve a estar disponible; la app debe cancelar el registro o descartar el existente Devoluciones de llamada 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 el 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 ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback