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émenteur IMS peut fournir des informations de signalisation importantes à la plate-forme, telles que des informations d'enregistrement IMS, l'intégration de SMS sur IMS et l'intégration de la fonctionnalité MmTel pour fournir des appels vocaux et vidéo. L'API ImsService est également une API système Android, ce qui 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'adresse /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 varie selon que l'implémentation IMS est entièrement sur le processeur de l'application ou si elle est partiellement ou entièrement déchargée sur le modem. Android ne fournit pas de HAL public pour le déchargement vers le processeur de bande de base. Tout déchargement doit donc avoir lieu à 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 utilisant une ancienne implémentation pour IMS ne sont pas compatibles avec l'API. Pour ces appareils, les anciennes interfaces AIDL et classes 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 l'étendre à 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 liera ensuite à ImsService à l'aide de la couche de compatibilité fournie dans Android 9 pour fonctionner avec l'ancienne implémentation ImsService.

Enregistrement d'ImsService auprès du 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 AndroidManifest.xml de l'application. Ensuite, elle doit définir les fonctionnalités IMS prises en charge par l'implémentation (MmTel ou RCS). Enfin, elle doit être validée en tant qu'implémentation IMS de confiance dans la configuration de l'opérateur ou 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 dans le fichier manifeste au 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 au bon fonctionnement :

  • directBootAware="true" : permet au service d'être découvert et exécuté par telephony avant que l'utilisateur déverrouille l'appareil. Le service ne peut pas accéder au stockage chiffré de l'appareil avant que l'utilisateur ne le déverrouille. Pour en savoir plus, consultez Mode Direct Boot et Chiffrement basé sur les fichiers.
  • persistent="true" : permet à ce service de s'exécuter 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 conçue comme une 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 seul les applications système peuvent se voir accorder l'autorisation 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 de l'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 reste 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 souhaiterait implémenter une ou plusieurs de ces fonctionnalités. Une fois chaque fonctionnalité définie, cette page explique comment ImsService déclare l'ensemble des fonctionnalités qu'il définit pour chaque emplacement SIM.

FEATURE_MMTEL

ImsService implémente la fonctionnalité IMS MMTEL, qui prend en charge tous les supports IMS (spécifications IR.92 et IR.94), à l'exception de l'attachement d'urgence au PDN IMS pour les appels d'urgence. Toute implémentation de ImsService qui souhaite 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

La déclaration de cette fonctionnalité indique uniquement à la plate-forme que l'attachement 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 Circuit Switch Fallback pour les services d'urgence. La fonctionnalité FEATURE_MMTEL doit être définie pour que cette fonctionnalité le soit.

FEATURE_RCS

L'API ImsService n'implémente aucune fonctionnalité IMS RCS, 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 RCS. Si la carte SIM associée au service RCS est retirée, le framework appelle automatiquement RcsFeature#onFeatureRemoved, puis nettoie le 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 devrait normalement 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 que l'ImsService prendra en charge, il appelle ImsService#create[...]Feature pour chaque fonctionnalité dont l'ImsService sera responsable. Si les fonctionnalités compatibles avec l'application IMS changent, vous pouvez utiliser ImsService#onUpdateSupportedImsFeatures pour signaler au framework qu'il doit 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 que l'ImsService a été correctement défini dans AndroidManifest.xml, la plate-forme doit être configurée pour se lier (de manière sécurisée) à l'ImsService le cas échéant. Le framework se lie à deux types d'ImsServices :

  1. Services Ims "de remplacement" de l'opérateur : ces services Ims 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. Il est configuré à l'aide de l'élément
  2. Service Ims "par défaut" de l'appareil : il s'agit du service Ims 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 service Ims d'opérateur n'est pas disponible. Il est utile lorsque l'appareil ne comporte aucune carte SIM ou que la carte SIM insérée ne comporte aucun service Ims d'opérateur installé. Cela est défini dans la superposition d'appareil à l'aide des configurations suivantes :

Android n'est pas compatible avec les applications comportant 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 résider dans le dossier /system/priv-app/ ou /product/priv-app/ pour accorder les autorisations appropriées (à savoir les autorisations téléphone, micro, position, appareil photo et contacts). En vérifiant si le nom du package de l'implémentation IMS correspond aux valeurs CarrierConfig ou de superposition d'appareil définies ci-dessus, seules les applications préinstallées de confiance sont liées.

Personnalisation

Les applications qui implémentent un ImsService ne sont liées qu'aux appareils sur lesquels elles sont configurées en tant que configurations ImsService "override" de l'opérateur ou ImsService "default" de l'appareil pour les fonctionnalités MMTEL ou RCS. Le service ImsService permet également d'activer ou de désactiver dynamiquement les fonctionnalités IMS qu'il prend en charge (MMTEL et RCS) à l'aide de mises à jour utilisant la méthode ImsService#onUpdateSupportedImsFeatures. Cela déclenche le framework pour recalculer les ImsServices liés et les fonctionnalités qu'ils prennent en charge. Si l'application IMS met à jour le framework sans aucune fonctionnalité compatible, l'ImsService sera non 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 peut pas prendre en charge la liaison à tous les ImsServices possibles préchargés sur l'appareil. Il se liera à un maximum de deux ImsServices par emplacement SIM (un ImsService pour chaque fonctionnalité) dans l'ordre suivant, par fonctionnalité :

  1. Nom du package ImsService défini par la valeur CarrierConfig config_ims_[mmtel/rcs]_package_override_string 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 le cas où aucune carte SIM n'est insérée. Ce service ImsService DOIT être compatible avec la fonctionnalité MmTel d'urgence.

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

Examinons cela pour chaque fonctionnalité. Pour un appareil (à une ou plusieurs cartes SIM) avec une seule carte SIM insérée, deux fonctionnalités IMS sont possibles : MMTel et RCS. Le framework tentera d'effectuer la liaison dans l'ordre défini ci-dessus pour chaque fonctionnalité. Si la fonctionnalité n'est pas disponible pour l'ImsService défini dans le remplacement de la configuration de l'opérateur, le framework reviendra à 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 RCS
  • L'ImsService de l'opérateur B est compatible avec RCS et MMTel
  • L'OEM ImsService est compatible avec RCS et MMTel
Carte SIM insérée Fonctionnalité RCS Fonctionnalité MMTel
Opérateur A Opérateur A OEM
Transporteur B Transporteur B Transporteur B
Aucune carte SIM OEM OEM

Validation

Les outils permettant de vérifier l'implémentation de l'IMS lui-même ne sont pas inclus, car les spécifications de l'IMS sont extrêmement volumineuses et utilisent un équipement de vérification spécial. Les tests ne peuvent que 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 des classes ImsMmTelManager, ImsRcsManager ou ProvisioningManager spécifiques à 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
  • Mises à jour lorsque l'état d'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 est dissocié en raison d'un changement d'abonnement ou de configuration.

Sur les appareils équipés d'Android 13 ou version ultérieure, une application peut utiliser la classe ImsStateCallback pour surveiller si l'instance ImsService d'un abonnement associé est disponible ou non. Lorsque vous obtenez une instance de ImsMmTelManager ou ImsRcsManager, nous vous recommandons que l'application s'inscrive d'abord à 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 annuler l'enregistrement ou supprimer les rappels existants enregistrés via ImsMmTelManager, ImsRcsManager ou ProvisioningManager, puis 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 que ImsService et les API associées à IMS ne sont pas disponibles pour l'abonnement.

Dans le cas peu probable où 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.