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 d'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 offre aux opérateurs et aux OEM la possibilité de fournir dynamiquement une configuration d'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 une boutique d'applications. La plate-forme interroge l'application pour fournir la configuration des paramètres, y compris :
- Réseaux en itinérance/hors itinérance
- 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 d'opérateur et peut être dynamique en fonction des 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éseau mobile virtuel (MVNO) ou l'activation par le client de services supplémentaires.
- Prise en charge des appareils vendus via n'importe quel canal : par exemple, un téléphone sur le marché ouvert peut être configuré automatiquement avec les bons paramètres en téléchargeant une application depuis 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 framework et non via une API publique. L'API de configuration d'opérateur dans Android 6.0 est publique et bien définie.
Fonctionnement
Charger la configuration
La configuration d'opérateur fournie par cette fonctionnalité est un ensemble de paires clé/valeur qui modifient différents comportements liés à la téléphonie dans la plate-forme.
L'ensemble de valeurs pour un appareil particulier est déterminé en interrogeant les composants suivants dans l'ordre :
- L'application d'opérateur (facultatif, mais emplacement recommandé pour une configuration supplémentaire au-delà de ce qui existe dans l'Android Open Source Project (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 antérieur à 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 d'opérateur standard ne fournit pas. L'application de configuration de la plate-forme se trouve (dans Android 6.0) dans : packages/apps/CarrierConfig
L'objectif de cette application est 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. Au lieu de cela, les opérateurs doivent fournir l'application d'opérateur distincte pour la personnalisation de l'opérateur, ce qui permet de distribuer les mises à jour via des canaux tels que les boutiques d'applications.
Comment les privilèges sont-ils accordés à une application d'opérateur ?
L'application d'opérateur en question doit être signée avec le même certificat que celui de la carte SIM, comme indiqué dans Privilèges d'opérateur UICC.
Quelles informations sont transmises à l'application d'opérateur ?
L'application d'opérateur reçoit les valeurs suivantes, ce qui lui permet de prendre une décision dynamique quant aux valeurs à renvoyer :
- CM
- 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 des ID d'opérateur à CarrierConfig.
Quand le chargement de la configuration d'opérateur a-t-il lieu ?
La création de la liste des paires clé/valeur a lieu :
- Lorsque la carte SIM est chargée (démarrage ou remplacement à chaud de la carte SIM)
- Lorsque l'application d'opérateur déclenche manuellement un rechargement
- Lorsque l'application d'opérateur est mise à jour
Pour en savoir plus, consultez la
android.service.carrier.CarrierService#onLoadConfig()
référence.
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 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 d'application tels que les valeurs de connexion VVM dans le Dialer
Clés de configuration
La liste des clés est définie dans le SDK public dans android.telephony.CarrierConfigManager
et ne peut pas être modifiée au sein du même niveau d'API. Consultez le tableau ci-dessous pour obtenir un résumé des clés.
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
onLoadConfigpour renvoyer les valeurs que vous souhaitez fournir en fonction de l'objetservice.carrier.CarrierIdentifiertransmis. - Ajoutez une logique pour appeler
notifyConfigChangedForSubIddans 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).
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
android.service.carrier.CarrierService
référence.
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>Signer l'application avec le même certificat sur la carte SIM
Pour connaître les exigences, consultez Privilèges d'opérateur UICC.
Ajouter des APN avec une application d'opérateur
Pour ajouter des APN par programmation à partir d'une application d'opérateur (par exemple, lors de l'activation de la carte SIM), utilisez
ContentResolver les API 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 APN et CarrierConfig.
Tester l'application
Une fois votre application de configuration créée, 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 d'opérateur
Dans Android, les fonctionnalités du service d'opérateur décrivent si les services vocaux, de messagerie et de données sont compatibles sur un appareil. Les opérateurs peuvent spécifier les fonctionnalités du service d'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 d'un 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 de service 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 fonctionnalités de service au niveau de l'abonnement, utilisez l'
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
API. 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 d'opérateur pour un abonnement spécifié via la
SubscriptionInfo.getServiceCapabilities()
méthode. 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 de numérotation n'autorise pas les appels si l'utilisateur dispose d'un abonnement réservé aux données.
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 au niveau de l'abonnement. En raison de cette modification, les API de fonctionnalités au niveau de l'appareil existantes 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() |