Android 6.0 et les 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 des superpositions de configuration statiques et permet aux opérateurs et aux OEM de fournir de manière dynamique la configuration de l'opérateur à la plate-forme via une interface définie.
Une application de l'opérateur correctement signée peut être préchargée dans l'image système, installée automatiquement ou installée manuellement via une plate-forme de téléchargement d'applications. L'application est interrogée par la plate-forme pour fournir la configuration de paramètres tels que les suivants:
- Réseaux en itinérance
- Messagerie vocale visuelle
- Paramètres réseau pour les 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 d'informations détaillées transmises à l'application via la plate-forme.
Voici les principaux avantages de cette approche :
- Configuration dynamique : compatibilité avec des concepts tels que la configuration dérivée non MCCMNC, par exemple, les opérateurs de réseau virtuel mobile (MVNO) ou l'activation de services supplémentaires par le client.
- Compatibilité avec les appareils vendus via n'importe quel canal : par exemple, un téléphone du marché libre peut être configuré automatiquement avec les paramètres appropriés en téléchargeant une application depuis une plate-forme de téléchargement d'applications.
- Sécurité : le droit 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 dans le framework, et non via une API publique. L'API de configuration de l'opérateur dans 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 d'un appareil particulier 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 plate-forme fournie avec l'image système
- Valeurs par défaut, codées en dur dans le framework (équivalent 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 du transporteur standard ne fournit pas. L'application de configuration de la plate-forme se trouve (sous Android 6.0) dans : packages/apps/CarrierConfig
L'objectif de cette application est de fournir une configuration par réseau lorsqu'aucune application d'opérateur n'est 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 de l'opérateur, ce qui permet de distribuer les mises à jour via des canaux tels que les plates-formes de téléchargement d'applications.
Comment les droits d'accès sont-ils 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 la section Privilèges de l'opérateur UICC.
Informations transmises à l'application de l'opérateur
L'application de l'opérateur est fournie avec 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 de l'opérateur, consultez la section Intégrer des ID d'opérateur avec CarrierConfig.
Lors du chargement de la configuration de l'opérateur
La création de la liste des paires clé-valeur se produit:
- Lorsque la carte SIM est chargée (démarrage ou remplacement de la carte SIM à chaud)
- Lorsque l'application de l'opérateur déclenche manuellement une actualisation
- Mise à jour de l'application de l'opérateur
Pour en savoir plus, consultez la documentation de référence sur
android.service.carrier.CarrierService#onLoadConfig()
.
Utiliser la configuration
Une fois la configuration créée, les valeurs qu'elle contient sont utilisées pour définir différentes valeurs de configuration 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 numéroteur
Clés de configuration
La liste des clés est définie dans le SDK public dans android.telephony.CarrierConfigManager
et ne peut pas changer au même niveau d'API. Pour en savoir plus, consultez le tableau ci-dessous.
Créer 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 cas où la configuration de l'opérateur peut changer au fil du temps (par exemple, lorsque l'utilisateur ajoute des services supplémentaires à son compte).
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
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 SIM.
Pour connaître les conditions requises, consultez la page Droits d'opérateur UICC.
Ajouter des APN avec une application de l'opérateur
Pour ajouter des APN de manière programmatique à partir d'une application de l'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 la table pour l'URI de contenu, consultez
Telephony.Carriers
.
Pour en savoir plus, consultez les sections 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 équipé d'Android 6.0 ou version ultérieure, par exemple un appareil Android
Définir les fonctionnalités du service de transporteur
Sous Android, les fonctionnalités de service du transporteur indiquent si les services vocaux, de messagerie et de données sont compatibles avec 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 via les remplacements de ressources système suivants:
Les applications peuvent interroger les fonctionnalités de service au niveau de l'appareil via les API suivantes :
Fonctionnalités des services 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 des fonctionnalité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()
. Cela permet aux développeurs d'applications de 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 Téléphone ne permet pas de passer des appels si l'utilisateur dispose d'un abonnement de type "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 les API 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() |