Android 6.0 et versions ultérieures permettent aux applications privilégiées de fournir une configuration spécifique à l'opérateur à la plate-forme. Cette fonctionnalité, basée sur les privilèges de l'opérateur UICC introduits dans Android 5.1 (Lollipop MR1), permet de déplacer la configuration de l'opérateur hors des couches de configuration statiques. Elle permet également aux opérateurs et aux OEM de fournir dynamiquement la configuration de l'opérateur à la plate-forme via une interface définie.
Une application d'opérateur correctement signée peut être préchargée dans l'image système, installée automatiquement ou installée manuellement via un app store. La plate-forme interroge l'application pour fournir la configuration des paramètres, y compris :
- Réseaux en itinérance/non en itinérance
- Messagerie vocale visuelle
- Paramètres réseau des SMS/MMS
- Configurations VoLTE/IMS
La détermination des valeurs à renvoyer dépend entièrement de l'application de l'opérateur et peut être dynamique en fonction des informations détaillées transmises à l'application via la plate-forme.
Voici les principaux avantages de cette approche :
- Configuration dynamique : prise en charge de concepts tels que la configuration non dérivée de MCCMNC, par exemple les opérateurs de réseau mobile virtuel (MVNO) ou l'activation par le client de services supplémentaires.
- Prise en charge des appareils vendus sur n'importe quel canal : par exemple, un téléphone en vente libre peut être configuré automatiquement avec les bons paramètres en téléchargeant une application depuis un app store.
- Sécurité : le privilège permettant de fournir cette configuration n'est accordé qu'aux applications signées par l'opérateur.
- API définie : auparavant, cette configuration était principalement stockée dans des superpositions XML internes au framework et non via une API publique. L'API CarrierConfig d'Android 6.0 est publique et bien définie.
Fonctionnement
Charger la configuration
La configuration de l'opérateur fournie par cette fonctionnalité est un ensemble de paires clé/valeur qui modifient divers comportements liés à la téléphonie sur la plate-forme.
L'ensemble de valeurs pour un appareil spécifique est déterminé en interrogeant les composants suivants dans l'ordre :
- L'application de l'opérateur (facultatif, mais emplacement recommandé pour la configuration supplémentaire au-delà de ce qui existe dans le projet Android Open Source (AOSP))
- Application de configuration de la plate-forme fournie avec l'image système
- Valeurs par défaut codées en dur dans le framework (équivalentes au comportement antérieur à Android 6.0)
Application de configuration de la plate-forme
Une application de configuration de plate-forme générique est fournie avec l'image système. Cette application peut fournir des valeurs pour toutes les variables que l'application opérateur standard ne fournit pas. L'application de configuration de la plate-forme est disponible (dans Android 6.0) à l'adresse suivante : packages/apps/CarrierConfig
Cette application a pour but de fournir une configuration par réseau lorsqu'une application d'opérateur n'est pas installée. Les opérateurs/OEM ne doivent y apporter que des modifications minimes dans leurs propres images. Les opérateurs doivent plutôt fournir une application distincte pour la personnalisation, ce qui permet de distribuer les mises à jour par le biais de plates-formes de téléchargement d'applications, par exemple.
Comment les droits d'accès sont accordés à une application de l'opérateur
L'application de l'opérateur en question doit être signée avec le même certificat que celui figurant sur la carte SIM, comme indiqué dans Privilèges de l'opérateur UICC.
Informations transmises à l'application de l'opérateur
L'application du transporteur reçoit les valeurs suivantes, ce qui lui permet de prendre une décision dynamique quant aux valeurs à renvoyer :
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- ID de l'opérateur
Pour en savoir plus sur l'intégration des ID d'opérateur, consultez Intégrer les ID d'opérateur avec CarrierConfig.
Quand le chargement de la configuration de l'opérateur a-t-il lieu ?
La liste des paires clé-valeur est créée :
- Lorsque la carte SIM est chargée (au démarrage ou lors d'un échange à chaud de la carte SIM)
- Lorsque l'application de l'opérateur déclenche manuellement un rechargement
- Lorsque l'application de l'opérateur est mise à jour
Pour en savoir plus, consultez la documentation de référence sur
android.service.carrier.CarrierService#onLoadConfig()
.
Utiliser la configuration
Lorsque la configuration est créée, les valeurs qu'elle contient sont utilisées pour définir différentes valeurs de configuration du système, y compris :
- Paramètres de téléphonie du framework interne
- Valeurs de configuration renvoyées par le SDK, par exemple dans SmsManager
- Paramètres de l'application, comme les valeurs de connexion VVM dans le clavier téléphonique
Clés de configuration
La liste des clés est définie dans le SDK public android.telephony.CarrierConfigManager
et ne peut pas être modifiée au sein du même niveau d'API. Pour obtenir un récapitulatif des clés, consultez le tableau ci-dessous.
Compiler l'application
Créer l'application
Votre application doit cibler le niveau d'API Android 6.0 (23).
Déclarer une classe qui remplace android.service.carrier.CarrierService
- Remplacez
onLoadConfig
pour renvoyer les valeurs que vous souhaitez fournir en fonction de l'objetservice.carrier.CarrierIdentifier
transmis. - Ajoutez une logique pour appeler
notifyConfigChangedForSubId
dans les scénarios où la configuration de l'opérateur peut changer au fil du temps (par exemple, lorsque l'utilisateur ajoute des services à son compte).
En voici un exemple :
public class SampleCarrierConfigService extends CarrierService { private static final String TAG = "SampleCarrierConfigService"; public SampleCarrierConfigService() { Log.d(TAG, "Service created"); } @Override public PersistableBundle onLoadConfig(CarrierIdentifier id) { Log.d(TAG, "Config being fetched"); PersistableBundle config = new PersistableBundle(); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false); config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6); // Check CarrierIdentifier and add more config if needed… return config; } }
Pour en savoir plus, consultez la documentation de référence sur android.service.carrier.CarrierService
.
Nommer la classe dans le fichier manifeste
En voici un exemple :
<service android:name=".SampleCarrierConfigService" android:label="@string/service_name" android:permission="android.permission.BIND_CARRIER_SERVICES"> <intent-filter> <action android:name="android.service.carrier.CarrierService"/></intent-filter> </service>
Signez l'application avec le même certificat sur la carte SIM.
Pour connaître les exigences, consultez Droits d'accès des opérateurs UICC.
Ajouter des APN avec une application d'opérateur
Pour ajouter des APN de manière programmatique à partir d'une application d'opérateur (par exemple, lors de l'activation de la carte SIM), utilisez les
API ContentResolver
pour ajouter des éléments APN à un fournisseur de contenu identifié par l'URI
android.provider.Telephony.Carriers.CONTENT_URI
.
Pour en savoir plus sur la structure de tableau de l'URI de contenu, consultez
Telephony.Carriers
.
Pour en savoir plus, consultez APN et CarrierConfig.
Tester l'application
Une fois que vous avez créé votre application de configuration, vous pouvez tester votre code avec :
- Une carte SIM contenant une signature de certificat valide
- Un appareil fonctionnant sous Android 6.0 ou version ultérieure, par exemple un appareil Android
Définir les fonctionnalités du service de l'opérateur
Dans Android, les fonctionnalités de service de l'opérateur décrivent si les services vocaux, de messagerie et de données sont pris en charge sur un appareil. Les opérateurs peuvent spécifier les fonctionnalités de service de l'opérateur pour un appareil au niveau de l'appareil et au niveau de l'abonnement (Android 15 ou version ultérieure).
Fonctionnalités de service au niveau de l'appareil
Les fonctionnalités de service au niveau de l'appareil sont configurées lors de la fabrication de l'appareil (elles ne peuvent pas être modifiées après la fabrication). Les opérateurs peuvent spécifier des fonctionnalités au niveau de l'appareil à l'aide des substitutions de ressources système suivantes :
Les applications peuvent interroger les capacités de service au niveau de l'appareil à l'aide des API suivantes :
Fonctionnalités au niveau de l'abonnement
Pour les appareils équipés d'Android 15 ou version ultérieure, les opérateurs peuvent spécifier les fonctionnalités de service de l'appareil au niveau de l'abonnement. Pour spécifier les capacités de service au niveau de l'abonnement, utilisez l'API
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
. Par exemple, pour spécifier qu'un abonnement est réservé aux données, définissez la valeur sur
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Les applications (applications système préchargées et applications tierces) peuvent interroger les fonctionnalités du service de l'opérateur pour un abonnement spécifié via la méthode
SubscriptionInfo.getServiceCapabilities()
. Les développeurs d'applications peuvent ainsi personnaliser l'expérience utilisateur des applications en fonction des fonctionnalités disponibles pour l'abonnement. Par exemple, les développeurs d'applications peuvent s'assurer que l'application de téléphone ne permet pas de passer des appels si l'utilisateur dispose d'un forfait de données uniquement.
API de fonctionnalités de service obsolètes
À partir d'Android 15, Android fournit des fonctionnalités de service au niveau de l'appareil et de l'abonnement. En raison de ce changement, les API de fonctionnalités existantes au niveau de l'appareil ont été renommées pour une meilleure lisibilité. Le tableau suivant répertorie les API obsolètes et renommées introduites dans Android 15 :
Obsolète (Android 14 ou version antérieure) | Équivalent (Android 15 ou version ultérieure) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |