Configuration du transporteur

Android 6.0 et versions ultérieures incluent une fonctionnalité permettant 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 transporteur 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 OEM 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 plateforme pour fournir la configuration des 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 des informations détaillées transmises à l'application via la plateforme.

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 le client optant pour des services supplémentaires.
  • Prise en charge des appareils vendus via n'importe quel canal - Par exemple, un téléphone du marché libre peut être automatiquement configuré 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 est accordé uniquement 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 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.

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 :

  1. L'application de l'opérateur (c'est facultatif, mais c'est l'emplacement recommandé pour une configuration supplémentaire au-delà de ce qui existe dans le projet Android Open Source (AOSP))
  2. L'application de configuration de la plateforme fournie avec l'image système
  3. 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 plateforme

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 plateforme se trouve (sous 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 devraient fournir une application d'opérateur distincte pour la personnalisation de l'opérateur, permettant ainsi de distribuer les mises à jour via des canaux tels que les magasins d'applications.

Comment le privilège est accordé à une application d'opérateur

L'application de l'opérateur en question doit être signée avec le même certificat que celui trouvé sur la carte SIM, comme indiqué dans UICC Carrier Privileges .

Quelles informations sont transmises à l'application du transporteur

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 :

  • Centre multicompte
  • multinationale
  • SPN
  • IMSI
  • GID1
  • GID2
  • Identifiant du transporteur

Pour plus d'informations sur l'intégration des ID d'opérateur, consultez Intégration des ID d'opérateur avec CarrierConfig .

Lors du chargement de la configuration du transporteur

La construction de la liste des paires clé-valeur s'effectue :

  • Lorsque la carte SIM est chargée (démarrage ou é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

Voir la référence android.service.carrier.CarrierService#onLoadConfig() pour plus de détails.

Utiliser 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 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 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. Consultez le tableau ci-dessous pour un résumé des clés.

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

  1. Remplacez onLoadConfig pour renvoyer les valeurs que vous souhaitez fournir en fonction de l'objet service.carrier.CarrierIdentifier transmis.
  2. 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 programmation à 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

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 exécutant Android 6.0 et versions ultérieures, par exemple un appareil Android