Implémenter IMS

Android 9 introduit une interface SystemApi appelée ImsService pour vous aider à implémenter le sous-système multimédia IP (IMS). L'API ImsService est une interface bien définie entre la plate-forme Android et une implémentation IMS fournie par un fournisseur ou un opérateur.

Présentation d'ImsService

Figure 1 : Présentation d'ImsService

En utilisant l'interface ImsService, l'implémentateur IMS peut fournir à la plate-forme des informations de signalisation importantes, telles que des informations d'enregistrement IMS, l'intégration des SMS via IMS et l'intégration de la fonctionnalité MmTel pour fournir des appels vocaux et vidéo. L'API ImsService est également une API de système Android. Cela signifie qu'elle peut être compilée directement avec le SDK Android au lieu de la source. Une application IMS préinstallée sur l'appareil peut également être configurée pour être mise à jour sur le Play Store.

Exemples et source

Android fournit une application sur AOSP qui implémente des parties de l'API ImsService à des fins de test et de développement. Vous trouverez l'application à l'emplacement /testapps/ImsTestService.

Vous trouverez la documentation de l'API ImsService dans ImsService et dans les autres classes de l'API.

Implémentation

L'API ImsService est une API de haut niveau qui vous permet d'implémenter IMS de différentes manières, en fonction du matériel disponible. Par exemple, l'implémentation change selon que l'implémentation IMS est entièrement sur le processeur de l'application ou si elle est partiellement ou entièrement transférée vers le modem. Android ne fournit pas de HAL public pour l'externalisation vers le processeur de bande de base. Par conséquent, toute externalisation doit se produire à l'aide de votre extension HAL vers le modem.

Compatibilité avec les anciennes implémentations IMS

Bien qu'Android 9 inclue l'API ImsService, les appareils qui utilisent une ancienne implémentation pour IMS ne peuvent pas prendre en charge l'API. Pour ces appareils, les anciennes interfaces AIDL et les classes de wrapper ont été déplacées vers l'espace de noms android.telephony.ims.compat. Lors de la mise à niveau vers Android 9, les appareils plus anciens doivent effectuer les opérations suivantes pour continuer à prendre en charge l'ancienne API.

  • Modifiez l'espace de noms de l'implémentation ImsService pour qu'il s'étende à partir de l'API de l'espace de noms android.telephony.ims.compat.
  • Modifiez la définition du service ImsService dans AndroidManifest.xml pour utiliser l'action de filtre d'intent android.telephony.ims.compat.ImsService au lieu de l'action android.telephony.ims.ImsService.

Le framework se lie ensuite à ImsService à l'aide de la couche de compatibilité fournie dans Android 9 pour fonctionner avec l'ancienne implémentation ImsService.

Enregistrement d'ImsService avec le framework

L'API ImsService est implémentée en tant que service, auquel le framework Android se lie pour communiquer avec l'implémentation IMS. Trois étapes sont nécessaires pour enregistrer une application qui implémente un ImsService avec le framework. Tout d'abord, l'implémentation ImsService doit s'enregistrer auprès de la plate-forme à l'aide de l'AndroidManifest.xml de l'application. Ensuite, elle doit définir les fonctionnalités IMS compatibles avec l'implémentation (MmTel ou RCS). Enfin, elle doit être validée en tant qu'implémentation IMS fiable, soit dans la configuration de l'opérateur, soit dans la superposition de l'appareil.

Définition du service

L'application IMS enregistre un ImsService auprès du framework en ajoutant une entrée service au fichier manifeste à l'aide du format suivant:

<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 définition service dans AndroidManifest.xml définit les attributs suivants, qui sont nécessaires pour un fonctionnement correct:

  • directBootAware="true": permet au service d'être découvert et exécuté par telephony avant que l'utilisateur ne déverrouille l'appareil. Le service ne peut pas accéder au stockage chiffré par l'appareil avant que l'utilisateur ne déverrouille l'appareil. Pour en savoir plus, consultez les sections Prendre en charge le mode Démarrage direct et Chiffrement basé sur les fichiers.
  • persistent="true": permet à ce service d'être exécuté de manière persistante et de ne pas être arrêté par le système pour récupérer de la mémoire. Cet attribut ne fonctionne QUE si l'application est compilée en tant qu'application système.
  • permission="android.permission.BIND_IMS_SERVICE": garantit que seul un processus auquel l'autorisation BIND_IMS_SERVICE a été accordée peut se lier à l'application. Cela empêche une application malveillante de se lier au service, car seules les applications système peuvent être autorisées par le framework.

Le service doit également spécifier l'élément intent-filter avec l'action android.telephony.ims.ImsService. Cela permet au framework de trouver le ImsService.

Spécification des fonctionnalités IMS

Une fois que l'ImsService a été défini comme service Android dans AndroidManifest.xml, il doit définir les fonctionnalités IMS qu'il prend en charge. Android est actuellement compatible avec les fonctionnalités MmTel et RCS, mais seule MmTel est intégrée au framework. Bien qu'aucune API RCS ne soit intégrée au framework, il est toujours avantageux de le déclarer comme une fonctionnalité de l'ImsService.

Vous trouverez ci-dessous les fonctionnalités valides définies dans android.telephony.ims.ImsFeature qu'un ImsService peut fournir, ainsi qu'une explication et un exemple expliquant pourquoi une application IMS peut vouloir implémenter une ou toutes ces fonctionnalités. Une fois chaque fonctionnalité définie, cette page décrit comment ImsService déclare l'ensemble de fonctionnalités qu'il définit pour chaque emplacement de carte SIM.

FEATURE_MMTEL

ImsService implémente la fonctionnalité MMTEL IMS, qui prend en charge tous les médias IMS (spécifications IR.92 et IR.94), à l'exception de l'association d'urgence au PDN IMS pour les appels d'urgence. Toute implémentation de ImsService souhaitant prendre en charge les fonctionnalités MMTEL doit étendre la classe de base android.telephony.ims.MmTelFeature et renvoyer une implémentation MmTelFeature personnalisée dans ImsService#createMmTelFeature.

FEATURE_EMERGENCY_MMTEL

Déclarer cette fonctionnalité ne signale à la plate-forme que l'association d'urgence au PDN IMS pour les services d'urgence est possible. Si cette fonctionnalité n'est pas déclarée pour votre ImsService, la plate-forme utilisera toujours le basculement par commutateur de circuits par défaut pour les services d'urgence. La fonctionnalité FEATURE_MMTEL doit être définie pour que cette fonctionnalité puisse être définie.

FEATURE_RCS

L'API ImsService n'implémente aucune fonctionnalité RCS IMS, mais la classe de base android.telephony.ims.RcsFeature peut toujours être utile. Le framework se lie automatiquement à ImsService et appelle ImsService#createRcsFeature lorsqu'il détecte que le package doit fournir le RCS. Si la carte SIM associée au service RCS est supprimée, le framework appelle automatiquement RcsFeature#onFeatureRemoved, puis nettoie l'ImsService associé à la fonctionnalité RCS. Cette fonctionnalité peut supprimer une partie de la logique de détection ou de liaison personnalisée qu'une fonctionnalité RCS aurait autrement dû fournir.

Enregistrement des fonctionnalités compatibles

Le framework de téléphonie se lie d'abord à ImsService pour interroger les fonctionnalités qu'il prend en charge à l'aide de l'API ImsService#querySupportedImsFeatures. Une fois que le framework a calculé les fonctionnalités compatibles avec ImsService, il appelle ImsService#create[...]Feature pour chaque fonctionnalité dont ImsService sera responsable. Si les fonctionnalités compatibles avec l'application IMS changent, vous pouvez utiliser ImsService#onUpdateSupportedImsFeatures pour indiquer au framework de recalculer les fonctionnalités compatibles. Pour en savoir plus sur l'initialisation et la liaison de l'ImsService, consultez le schéma suivant.

Initialisation et liaison d&#39;ImsService

Figure 2. Initialisation et liaison d'ImsService

Détection et validation du framework d'une implémentation ImsService

Une fois l'ImsService défini correctement dans AndroidManifest.xml, la plate-forme doit être configurée pour se lier (de manière sécurisée) à l'ImsService si nécessaire. Le framework se lie à deux types d'ImsServices:

  1. ImsService "override" de l'opérateur: ces ImsServices sont préchargés sur l'appareil, mais sont associés à un ou plusieurs opérateurs mobiles et ne seront liés que lorsqu'une carte SIM correspondante sera insérée. Cette configuration est effectuée à l'aide de la propriété
  2. ImsService "par défaut" de l'appareil: il s'agit de l'ImsService par défaut chargé sur l'appareil par un OEM. Il doit être conçu pour fournir des services IMS dans toutes les situations où un ImsService de l'opérateur n'est pas disponible. Il est utile lorsque l'appareil n'a pas de carte SIM insérée ou que la carte SIM insérée n'a pas de service Ims de l'opérateur installé. Cela est défini dans la superposition de l'appareil à l'aide des configurations suivantes :

Android n'est pas compatible avec les applications avec des implémentations ImsService téléchargeables tierces. Par conséquent, toutes les implémentations ImsService définies ici doivent être des applications système et doivent se trouver dans le dossier /system/priv-app/ ou /product/priv-app/ pour accorder les autorisations appropriées (à savoir, les autorisations de téléphone, de micro, de position, d'appareil photo et de contacts). En vérifiant si le nom du package de l'implémentation IMS correspond aux valeurs de superposition CarrierConfig ou de l'appareil définies ci-dessus, seules les applications préinstallées fiables sont liées.

Personnalisation

Les applications implémentant un ImsService ne sont liées que sur les appareils où elles sont configurées en tant que configurations ImsService "override" de l'opérateur ou "par défaut" de l'appareil pour la fonctionnalité MMTEL ou RCS. ImsService permet également d'activer ou de désactiver de manière dynamique les fonctionnalités IMS qu'il prend en charge (MMTEL et RCS) à l'aide de mises à jour à l'aide de la méthode ImsService#onUpdateSupportedImsFeatures. Cela déclenche le framework pour qu'il recalcule les ImsServices liés et les fonctionnalités qu'ils prennent en charge. Si l'application IMS met à jour le framework sans aucune fonctionnalité prise en charge, ImsService n'est pas lié jusqu'à ce que le téléphone soit redémarré ou qu'une nouvelle carte SIM correspondant à l'application IMS soit insérée.

Priorité de liaison pour plusieurs ImsService

Le framework ne prend pas en charge la liaison à tous les ImsServices possibles préchargés sur l'appareil. Il se lie à un maximum de deux ImsServices par emplacement de carte SIM (un ImsService pour chaque fonctionnalité) dans l'ordre suivant, par fonctionnalité:

  1. Nom du package ImsService défini par la valeur config_ims_[mmtel/rcs]_package_override_string de CarrierConfig lorsqu'une carte SIM est insérée.
  2. Nom du package ImsService défini dans la valeur de superposition de l'appareil pour config_ims_[mmtel/rcs]_package, y compris dans le cas où aucune carte SIM n'est insérée. Cet ImsService DOIT être compatible avec la fonctionnalité MmTel d'urgence.

Vous devez définir le nom de package de votre ImsService dans CarrierConfig pour chacun des opérateurs qui utiliseront ce package ou dans la superposition de l'appareil si votre ImsService est défini par défaut, comme indiqué ci-dessus.

Décomposons cela pour chaque fonctionnalité. Pour un appareil (mono-SIM ou multi-SIM) avec une seule carte SIM chargée, deux fonctionnalités IMS sont possibles: MMTel et RCS. Le framework tentera de lier dans l'ordre défini ci-dessus pour chaque fonctionnalité. Si la fonctionnalité n'est pas disponible pour l'ImsService défini dans le forçage de la configuration du transporteur, le framework utilisera votre ImsService par défaut. Par exemple, le tableau ci-dessous décrit la fonctionnalité IMS que le framework utilisera étant donné trois applications IMS implémentant ImsServices installées sur un système avec les fonctionnalités suivantes:

  • L'ImsService de l'opérateur A est compatible avec le RCS
  • L'ImsService de l'opérateur B est compatible avec le RCS et MMTel
  • OEM ImsService est compatible avec le RCS et MMTel
Carte SIM insérée Fonctionnalité RCS Fonctionnalité MMTel
Compagnie aérienne A Compagnie aérienne A OEM
Opérateur B Opérateur B Opérateur B
Aucune carte SIM OEM OEM

Validation

Les outils permettant de vérifier l'implémentation de l'IMS elle-même ne sont pas inclus, car les spécifications de l'IMS sont extrêmement volumineuses et utilisent un équipement de validation spécial. Les tests ne peuvent vérifier que le framework de téléphonie répond correctement à l'API ImsService.

Développer une application IMS

Lorsque vous développez une application IMS qui interagit avec la pile de téléphonie Android, nous vous recommandons de spécifier que l'application peut écouter ou modifier l'état de l'instance ImsService associée à un abonnement opérateur spécifique.

Pour écouter ou modifier l'état d'ImsService pour les fonctionnalités MMTEL et RCS, utilisez la classe ImsManager pour obtenir une instance de la classe ImsMmTelManager, ImsRcsManager ou ProvisioningManager spécifique à l'IMS. L'application peut ensuite écouter les états de service et de provisionnement spécifiques à l'IMS, tels que:

  • Fonctionnalités MMTEL ou RCS activées et disponibles
  • Mise à jour lorsque l'état de l'enregistrement IMS change
  • État du provisionnement des fonctionnalités IMS
  • Fonctionnalités IMS activées par l'utilisateur

Utiliser ImsStateCallback

Bien qu'ImsService soit un service lié de manière persistante, le service lié peut changer lorsqu'une nouvelle carte SIM ou un nouvel abonnement intégré devient actif, ou lorsqu'une configuration d'opérateur change. Étant donné qu'ImsService ne fait pas partie du processus de téléphonie, une application peut rencontrer des exceptions inattendues lorsqu'elle tente d'accéder aux API IMS si ImsService plante de manière invisible ou n'est pas lié en raison d'un changement d'abonnement ou de configuration.

Sur les appareils équipés d'Android 13 ou version ultérieure, pour vérifier si l'instance ImsService d'un abonnement associé est disponible ou non, une application peut utiliser la classe ImsStateCallback. Lorsque vous obtenez une instance de ImsMmTelManager ou ImsRcsManager, nous vous recommandons de commencer par enregistrer l'application pour un rappel d'état IMS à l'aide de ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback. Pour continuer à recevoir des mises à jour de rappel pour des abonnements spécifiques lorsque ImsService redevient disponible, l'application doit désenregistrer ou supprimer les rappels existants enregistrés via ImsMmTelManager, ImsRcsManager ou ProvisioningManager, et enregistrer de nouveaux rappels.

Si un abonnement n'est pas compatible avec IMS, le framework appelle ImsStateCallback#onUnavailable avec le motif REASON_NO_IMS_SERVICE_CONFIGURED. Cela signifie qu'ImsService et les API associées à l'IMS ne sont pas disponibles pour l'abonnement.

Dans l'éventualité peu probable que le processus de téléphonie plante, l'application reçoit ImsStateCallback#onError et ne reçoit plus de mises à jour sur l'instance ImsStateCallback enregistrée. Pour résoudre ce problème, réenregistrez l'instance ImsStateCallback pour l'abonnement associé en appelant ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback.