Android 6.0 et versions ultérieures incluent une capacité pour les applications privilégiées afin de fournir une configuration spécifique à l'opérateur à la plate-forme. Cette fonctionnalité, basée sur les privilèges d'opérateur UICC introduits dans Android 5.1 (Lollipop MR1), permet d'éloigner la configuration de l'opérateur des superpositions de configuration statiques et donne aux opérateurs et aux équipementiers la possibilité 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 manuellement via une boutique d'applications. L'application est interrogée par la plate-forme pour fournir une configuration pour les paramètres, notamment :
- Réseaux itinérants/non itinérants
- Messagerie vocale visuelle
- Paramètres réseau 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.
Les principaux avantages de cette approche sont les suivants :
- Configuration dynamique - Prise en charge de concepts tels que la configuration dérivée non MCCMNC, par exemple, les opérateurs de réseaux virtuels mobiles (MVNO) ou l'abonnement des clients à des services supplémentaires.
- Prise en charge des appareils vendus via n'importe quel canal - Par exemple, un téléphone du marché ouvert peut être automatiquement configuré avec les bons paramètres en téléchargeant une application à partir d'un magasin d'applications.
- Sécurité - Le privilège 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 sein du cadre et non via une API publique. L'API de configuration de l'opérateur dans Android 6.0 est publique et bien définie.
Comment ça fonctionne
Chargement de 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 dans la plate-forme.
L'ensemble de valeurs pour un périphérique particulier est déterminé en interrogeant les composants suivants dans l'ordre :
- L'application de l'opérateur (ceci est facultatif, mais c'est l'emplacement recommandé pour une configuration supplémentaire au-delà de ce qui existe dans le projet Open Source Android (AOSP))
- L'application de configuration de la plate-forme fournie avec l'image système
- Valeurs par défaut, codées en dur dans le framework (équivalent au comportement avant Android 6.0)
L'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 de l'opérateur standard ne fournit pas. L'application de configuration de la plate-forme se trouve (dans Android 6.0) dans : packages/apps/CarrierConfig
Le but de cette application est de fournir une configuration par réseau lorsqu'une application d'opérateur n'est pas installée, et les opérateurs/OEM ne doivent y apporter que des modifications minimes dans leurs propres images. Au lieu de cela, les opérateurs doivent fournir l'application de l'opérateur distincte pour la personnalisation de l'opérateur, permettant aux mises à jour d'être distribuées via des avenues telles que les magasins d'applications.
Comment le privilège est accordé à une application de transporteur
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 documenté dans UICC Carrier Privileges .
Quelles informations sont transmises à l'application de l'opérateur
L'application opérateur est fournie avec les valeurs suivantes, ce qui lui permet de prendre une décision dynamique quant aux valeurs à renvoyer :
- CMC
- multinationale
- SPN
- IMSI
- GID1
- GID2
- Identifiant du transporteur
Pour plus d'informations sur l'intégration des ID de transporteur, voir Intégration des ID de transporteur avec CarrierConfig .
Lors du chargement de la configuration de l'opérateur
La construction de la liste des paires clé-valeur se produit :
- Lorsque la carte SIM est chargée (démarrage ou remplacement à 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
Voir la référence android.service.carrier.CarrierService#onLoadConfig()
pour plus de détails.
Utilisation de la configuration
Lorsque la configuration est créée, les valeurs qu'elle contient sont utilisées pour définir diverses valeurs de configuration du système, notamment :
- Paramètres de téléphonie du cadre interne
- Valeurs de configuration renvoyées par le SDK, par exemple, dans SmsManager
- Paramètres d'application tels que les valeurs de connexion VVM dans le numéroteur
Clés de configuration
La liste des clés est définie dans le cadre du SDK public dans android.telephony.CarrierConfigManager
et ne peut pas changer au sein du même niveau d'API. Voir le tableau ci-dessous pour un résumé des touches.
Construire l'application
Création de 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 supplémentaires à son compte).
Un exemple est ci-dessous :
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 plus de détails, consultez la référence android.service.carrier.CarrierService
.
Nommer la classe dans le manifeste
Un exemple est ci-dessous :
<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>
Signer l'application avec le même certificat sur SIM
Voir Privilèges de transporteur UICC pour les exigences.
Ajouter des APN avec une application d'opérateur
Pour ajouter des APN par programme à 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 plus d'informations sur la structure de table pour l'URI de contenu, consultez Telephony.Carriers
.
Pour plus d'informations, consultez APN et CarrierConfig .
Tester l'application
Lorsque vous avez créé votre application de configuration, vous pouvez tester votre code avec :
- Une carte SIM contenant une signature de certificat valide
- Un appareil exécutant Android 6.0 et versions ultérieures, par exemple un appareil Android