Android 6.0 et les versions ultérieures disposent d'une fonctionnalité pour fournir à la plate-forme une configuration spécifique à l'opérateur. Ce conformément aux droits d'opérateur UICC. introduite dans Android 5.1 (Lollipop MR1), permet aux opérateurs des superpositions de configuration statiques les opérateurs et les OEM peuvent fournir la configuration des opérateurs de façon dynamique 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és automatiquement ou manuellement via une plate-forme de téléchargement d'applications. L'application est interrogée par la plate-forme pour fournir la configuration des paramètres y compris:
- Réseaux en itinérance
- Messagerie vocale visuelle
- Paramètres réseau pour les SMS/MMS
- Configurations VoLTE/IMS
L'application de l'opérateur est entièrement responsable de la détermination des valeurs à renvoyer. Ils peuvent être dynamiques en fonction d'informations détaillées transmises à l'application via Google Cloud.
Les principaux avantages de cette approche sont les suivants:
- Configuration dynamique : prise en charge de concepts tels que configuration non dérivée d'une fonction MCCMNC, par exemple, d'opérateurs de réseaux virtuels mobiles (MVNO) ou d'activer des services supplémentaires par le client.
- Compatibilité avec les appareils vendus via tous les canaux (par exemple, un le téléphone open market peut être configuré automatiquement avec la bonne en téléchargeant une application sur une plate-forme de téléchargement d'applications.
- Sécurité : le droit pour fournir cette configuration est n'est distribué qu'aux applications signées par l'opérateur.
- API définie : cette configuration était précédemment stockée. principalement dans des superpositions XML internes au sein du framework, et non via une API. 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 des valeurs associées à un appareil spécifique est déterminé en interrogeant les les composants suivants dans l'ordre:
- L'application de l'opérateur (facultatif, mais recommandé d'une configuration supplémentaire au-delà de ce qui existe dans l'application Android Open Projet 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 précédent vers 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
pour toutes les variables qui ne sont pas incluses dans l'application d'opérateur standard. Configuration de la plate-forme
l'application est disponible (sous Android 6.0) dans: packages/apps/CarrierConfig
L'objectif de cette application est de fournir une configuration par réseau lorsqu'un opérateur n'est pas installée, et les opérateurs/OEM ne doivent y apporter que des modifications minimes. dans leurs propres images. Les opérateurs doivent plutôt fournir l'application de l'opérateur distincte pour la personnalisation des opérateurs, ce qui permet de distribuer les mises à jour par le biais de moyens tels que en tant que plates-formes de téléchargement d'applications.
Attribution de droits à une application d'opérateur
L'application de l'opérateur en question doit être signée avec le même certificat que celui présent sur le site la carte SIM, comme indiqué dans l'article Droits d'opérateur de l'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 d'effectuer une une décision dynamique quant aux valeurs à renvoyer:
- MCC
- MNC
- SPN
- IMSI
- Numéro GID1
- GID2
- ID de l'opérateur
Pour en savoir plus sur l'intégration des ID d'opérateur, consultez <ph type="x-smartling-placeholder"></ph> Intégrer les ID d'opérateurs avec CarrierConfig.
Lors du chargement de la configuration de l'opérateur
La liste des paires clé-valeur est créée:
- 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
Consultez les
android.service.carrier.CarrierService#onLoadConfig()
pour en savoir plus.
Utiliser la configuration
Lors de la création de la configuration, 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 tels que les valeurs de connexion de la VM virtuelle dans l'application Téléphone
Clés de configuration
La liste des clés est définie pour le SDK public dans android.telephony.CarrierConfigManager
.
et ne peut pas changer dans le même niveau d'API. Vous trouverez un récapitulatif des clés dans 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
- Ignorez
onLoadConfig
pour renvoyer les valeurs que vous souhaitez fournir en fonction de l'objetservice.carrier.CarrierIdentifier
réussi. - Ajouter une logique pour appeler
notifyConfigChangedForSubId
dans les scénarios lorsque la configuration de l'opérateur peut changer au fil du temps (par exemple, 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 les
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>
Signez l'application avec la même certificat sur la SIM
Reportez-vous à la section Droits d'opérateur UICC pour exigences.
Ajouter des APN avec une application d'opérateur
Pour ajouter des APN de façon programmatique depuis l'application d'un opérateur (par exemple, lors de la connexion à la carte SIM
activation), utilisez
<ph type="x-smartling-placeholder"></ph>
API ContentResolver
pour ajouter des éléments APN à un fournisseur de contenu
identifiés par l'URI
<ph type="x-smartling-placeholder"></ph>
android.provider.Telephony.Carriers.CONTENT_URI
Pour en savoir plus sur la structure de la table pour l'URI de contenu, consultez
<ph type="x-smartling-placeholder"></ph>
Telephony.Carriers
.
Pour en savoir plus, consultez APN et CarrierConfig.
Tester l'application
Après avoir créé votre application de configuration, vous pouvez tester votre code par:
- Une carte SIM contenant une signature de certificat valide
- Un appareil équipé d'Android 6.0 ou version ultérieure (un appareil Android, par exemple)
Définir les fonctionnalités du service de transporteur
Dans Android, les capacités de service de l'opérateur décrivent si la voix, la messagerie, et les services de données sont pris en charge sur un appareil. Les opérateurs peuvent spécifier le transporteur fonctionnalités de service d'un appareil au niveau de l'appareil et 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 l'appareil est fabriqué (il ne peut pas être modifié après sa fabrication). Les opérateurs peuvent spécifier les fonctionnalités au niveau de l'appareil via la ressource système suivante : remplacements:
Les applications peuvent interroger les fonctionnalités de service au niveau de l'appareil via les méthodes suivantes : API:
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 le
de l'appareil au niveau de l'abonnement. Pour spécifier un service au niveau de l'abonnement
utilisez les fonctionnalités
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
API. Par exemple, pour spécifier qu'un abonnement ne comporte que des données, définissez la valeur sur
SubscriptionManager#SERVICE_CAPABILITY_DATA
Les applications (applications système préchargées et applications tierces) peuvent envoyer une requête à l'opérateur
des fonctionnalités de service pour un abonnement spécifié
SubscriptionInfo.getServiceCapabilities()
. Cela permet aux développeurs d'applications de personnaliser l'expérience utilisateur des applications en fonction
les 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 est sur un
données uniquement.
API de capacités de service obsolètes
À partir d'Android 15, Android fournit à la fois de services au niveau de l'abonnement. En raison de ce changement, les paramètres ont été renommées pour une meilleure lisibilité. Le tableau suivant répertorie API obsolètes et 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() |