Implémentation du SGI

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 de 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 les informations d'enregistrement IMS, l'intégration SMS sur IMS et l'intégration des fonctionnalités 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 construite 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 pouvoir ê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 pouvez trouver l'application sur /testapps/ImsTestService .

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

Mise en œuvre

L'API ImsService est une API de haut niveau qui vous permet d'implémenter IMS de plusieurs 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 d'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 être effectué à l'aide de votre extension HAL vers le modem.

Compatibilité avec les anciennes implémentations IMS

Bien qu'Android 9 inclut l'API ImsService, les appareils utilisant une ancienne implémentation d'IMS ne sont pas en mesure de prendre en charge 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 procéder comme suit pour continuer à prendre en charge l'ancienne API.

  • Modifiez l'espace de noms de l'implémentation ImsService pour étendre l'API d'espace de noms android.telephony.ims.compat .
  • Modifiez la définition du service ImsService dans AndroidManifest.xml pour utiliser l'action de filtre d'intention 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 .

Inscription ImsService avec le framework

L'API ImsService est implémentée en tant que service auquel le framework Android se lie afin de 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 plateforme à l’aide du AndroidManifest.xml de l’application ; deuxièmement, il doit définir les fonctionnalités IMS prises en charge par la mise en œuvre (MmTel ou RCS) ; et troisièmement, il doit être vérifié qu'il s'agit d'une implémentation IMS fiable, soit dans la configuration de l'opérateur, soit dans la superposition des appareils.

Définition du service

L'application IMS enregistre un ImsService auprès du framework en ajoutant une entrée service dans le manifeste en utilisant le 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, nécessaires au bon fonctionnement :

  • 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 crypté de l'appareil avant que l'utilisateur ne déverrouille l'appareil. Pour plus d'informations, consultez Prise en charge du mode de démarrage direct et du chiffrement basé sur les fichiers .
  • persistent="true" : Permet à ce service d'être exécuté de manière persistante et de ne pas être supprimé par le système pour récupérer de la mémoire. Cet attribut fonctionne UNIQUEMENT si l'application est créée en tant qu'application système.
  • permission="android.permission.BIND_IMS_SERVICE" : garantit que seul un processus disposant de l'autorisation BIND_IMS_SERVICE qui lui est accordée peut se lier à l'application. Cela empêche une application malveillante de se lier au service, puisque seules les applications système peuvent obtenir l'autorisation du 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 qu'ImsService a été défini en tant que service Android dans AndroidManifest.xml, ImsService doit définir les fonctionnalités IMS qu'il prend en charge. Android prend actuellement en charge 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 y a toujours des avantages à la déclarer comme fonctionnalité d'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 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 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 la connexion d'urgence au PDN IMS pour les appels d'urgence. Toute implémentation d' 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é signale uniquement à la plate-forme qu'une connexion 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 plateforme utilisera toujours par défaut Circuit Switch Fallback pour les services d'urgence. La fonctionnalité FEATURE_MMTEL doit être définie pour que cette fonctionnalité soit définie.

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 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/liaison personnalisée qu'une fonctionnalité RCS devrait autrement fournir.

Enregistrement des fonctionnalités prises en charge

L'infrastructure 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 qu'ImsService prendra en charge, il appellera ImsService#create[...]Feature pour chaque fonctionnalité dont ImsService sera responsable. Si les fonctionnalités prises en charge par l'application IMS changent, vous pouvez utiliser ImsService#onUpdateSupportedImsFeatures pour signaler à l'infrastructure de recalculer les fonctionnalités prises en charge. Consultez le schéma ci-dessous pour plus d’informations sur l’initialisation et la liaison d’ImsService.

ImsService initialisation et liaison

Figure 2 : initialisation et liaison d'ImsService

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

Une fois que l'ImsService a été défini correctement dans AndroidManifest.xml, la plate-forme doit être configurée pour se lier (en toute sécurité) à l'ImsService le cas échéant. Il existe deux types d'ImsServices auxquels le framework se lie :

  1. ImsService « de remplacement » par l'opérateur : ces ImsServices sont préchargés sur l'appareil mais sont connectés à un ou plusieurs opérateurs de téléphonie mobile et ne seront liés que lorsqu'une carte SIM correspondante est insérée. Ceci est configuré à l'aide du
  2. ImsService « par défaut » de l'appareil : il s'agit de l'ImsService par défaut qui est chargé sur l'appareil par un OEM et doit être conçu pour fournir des services IMS dans toutes les situations où un opérateur ImsService n'est pas disponible et est utile dans les situations où l'appareil n'a pas de carte SIM. inséré ou la carte SIM insérée n'a pas d'opérateur ImsService installé avec elle. Ceci est défini dans la superposition des appareils à l'aide des configurations suivantes :

Android ne prend pas en charge 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 l'autorisation appropriée. autorisations (à savoir les autorisations de téléphone, de microphone, de localisation, de caméra et de contacts). En vérifiant si le nom du package de l'implémentation IMS correspond aux valeurs CarrierConfig ou de superposition de périphérique définies ci-dessus, seules les applications fiables et préinstallées sont liées.

Personnalisation

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

  1. Le 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. Le nom du package ImsService défini dans la valeur de superposition de périphérique pour config_ims_[mmtel/rcs]_package y compris le cas où aucune carte SIM n'est insérée. Cet ImsService DOIT prendre en charge la fonctionnalité d'urgence MmTel.

Vous devez soit avoir le nom du package de votre ImsService défini dans CarrierConfig pour chacun des transporteurs qui utiliseront ce package, soit dans la superposition de l'appareil si votre ImsService sera celui par défaut, comme défini ci-dessus.

Décomposons cela pour chaque fonctionnalité. Pour un appareil (mono ou multi-SIM) avec une seule carte SIM chargée, deux fonctionnalités IMS sont possibles : MMTel et RCS. Le framework tentera de se lier dans l'ordre défini ci-dessus pour chaque fonctionnalité et 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. Ainsi, par exemple, le tableau ci-dessous décrit quelle fonctionnalité IMS le framework utilisera étant donné trois applications IMS implémentant ImsServices installées sur un système avec les fonctionnalités suivantes :

  • Le transporteur A ImsService prend en charge RCS
  • Carrier B ImsService prend en charge RCS et MMTel
  • OEM ImsService prend en charge RCS et MMTel
Carte SIM insérée Fonctionnalité RCS Fonctionnalité MMTel
Transporteur A Transporteur A OEM
Transporteur B Transporteur B Transporteur B
Pas de carte SIM OEM OEM

Validation

Les outils permettant de vérifier la mise en œuvre 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 peuvent uniquement vérifier que le framework de téléphonie répond correctement à l'API ImsService.

Développer une application IMS

Lors du développement d'une application IMS qui s'interface 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 attachée pour un abonnement d'opérateur spécifique.

Pour écouter ou modifier l'état de 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 à IMS. L'application peut ensuite écouter les états de service et d'approvisionnement spécifiques à IMS, tels que :

  • Fonctionnalités MMTEL ou RCS activées et disponibles
  • Mises à jour lorsque l'état d'enregistrement IMS change
  • État de 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 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 imprévues lorsqu'elle tente d'accéder aux API IMS si ImsService plante de manière invisible ou n'est plus lié en raison d'un abonnement ou d'une modification de configuration.

Sur les appareils exécutant Android 13 ou version ultérieure, pour contrôler si l'instance ImsService d'un abonnement associé est disponible ou indisponible, une application peut utiliser la classe ImsStateCallback . Lors de l'obtention d'une instance de ImsMmTelManager ou ImsRcsManager , nous recommandons que l'application s'inscrive d'abord 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 lorsqu'ImsService redevient disponible, l'application doit désenregistrer ou supprimer les rappels existants enregistrés via ImsMmTelManager , ImsRcsManager ou ProvisioningManager ; et enregistrez de nouveaux rappels.

S'il existe un abonnement qui ne prend pas en charge IMS, le framework appelle ImsStateCallback#onUnavailable avec la raison REASON_NO_IMS_SERVICE_CONFIGURED . Cela signifie qu'ImsService et les API lié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 cette condition, réenregistrez l'instance ImsStateCallback pour l'abonnement associé en appelant ImsMmTelManager#registerImsStateCallback ou ImsRcsManager#registerImsStateCallback .