Implémenter IMS

Android 9 introduit une nouvelle 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 Android System, ce qui signifie qu'elle peut être compilée directement avec le SDK Android plutôt qu'avec 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 publique pour le déchargement vers le processeur de bande de base. Par conséquent, tout déchargement doit 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 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 procéder comme suit 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 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. Premièrement, l'implémentation ImsService doit s'enregistrer auprès de la plate-forme à l'aide de l'AndroidManifest.xml de l'application. Deuxièmement, elle doit définir les fonctionnalités IMS compatibles avec l'implémentation (MmTel ou RCS). Troisièmement, elle doit être validée comme implémentation IMS de confiance, soit dans la configuration de l'opérateur, soit dans la superposition de l'appareil.

Définition de service

L'application IMS enregistre un ImsService avec le framework en ajoutant une entrée service au 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 de service dans AndroidManifest.xml définit les attributs suivants, qui sont nécessaires au bon fonctionnement:

  • directBootAware="true": permet à telephony de détecter et d'exécuter le service 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 pages 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 conçue 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 non autorisée de s'associer au service, car le framework ne peut accorder l'autorisation qu'aux applications système.

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 seul MmTel est intégré 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é IMS MMTEL, 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.

FONCTIONNALITÉ_EMERGENCY_MMTEL

Déclarer cette fonctionnalité n'indique à la plate-forme qu'une association d'urgence au PDN IMS pour les services d'urgence. Si cette fonctionnalité n'est pas déclarée pour votre ImsService, la plate-forme utilisera toujours le basculement par commutateur de circuit 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 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 aurait normalement dû fournir.

Enregistrement de 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 déterminé les fonctionnalités compatibles avec ImsService, 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 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 de framework et vérification d'une implémentation ImsService

Une fois l'ImsService correctement défini 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 "remplacer" par 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. La configuration s'effectue à l'aide des éléments suivants :
  2. ImsService "par défaut" de l'appareil: il s'agit du service 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 opérateur ImsService n'est pas disponible. Il est utile lorsqu'aucune carte SIM n'est insérée dans l'appareil ou lorsqu'aucun ImsService d'opérateur n'est installé sur la carte SIM. 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 par des tiers. Par conséquent, toutes les implémentations ImsService définies ici doivent être des applications système et doivent résider dans le dossier /system/priv-app/ ou /product/priv-app/ pour accorder les autorisations appropriées (à savoir les autorisations pour le téléphone, le micro, la localisation, l'appareil photo et les 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 recalculer les ImsServices liés et les fonctionnalités qu'ils prennent en charge. Si l'application IMS met à jour le framework sans fonctionnalités compatibles, ImsService sera dissocié 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 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'appel d'urgence.

Le nom du package de votre ImsService doit être défini dans CarrierConfig pour chacun des transporteurs qui utiliseront ce colis ou dans la superposition de l'appareil si ImsService est le service par défaut, comme indiqué ci-dessus.

Décomposons cela pour chaque fonctionnalité. Pour un appareil (carte SIM unique ou multiple) sur lequel une seule carte SIM est 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:

  • Le service ImsService de l'opérateur A est compatible avec le protocole 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
Opérateur 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 surveiller 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 est à nouveau 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.