Configurazione del vettore

Android 6.0 e versioni successive includono una capacità per le app privilegiate di fornire alla piattaforma la configurazione specifica dell'operatore telefonico. Questa funzionalità, basata sui privilegi dell'operatore UICC introdotti in Android 5.1 (Lollipop MR1), consente di spostare la configurazione dell'operatore dagli overlay di configurazione statica e offre agli operatori e agli OEM la possibilità di fornire dinamicamente la configurazione dell'operatore alla piattaforma attraverso un'interfaccia definita.

Un'app del gestore di telefonia correttamente firmata può essere precaricata nell'immagine di sistema, installata automaticamente o installata manualmente tramite un app store. L'app viene interrogata dalla piattaforma per fornire la configurazione per le impostazioni, tra cui:

  • Reti roaming / non roaming
  • Segreteria visiva
  • Impostazioni di rete SMS / MMS
  • Configurazioni VoLTE / IMS

La determinazione dei valori da restituire dipende interamente dall'app del gestore e può essere dinamica in base alle informazioni dettagliate trasmesse all'app tramite la piattaforma.

I principali vantaggi di questo approccio sono:

  • Configurazione dinamica : supporto per concetti come configurazione non derivata da MCCMNC, ad esempio, operatori di rete virtuale mobile (MVNO) o il cliente sceglie di accedere a servizi aggiuntivi.
  • Supporto per dispositivi venduti tramite qualsiasi canale : ad esempio, un telefono di mercato aperto può essere configurato automaticamente con le giuste impostazioni scaricando un'app da un app store.
  • Sicurezza : il privilegio di fornire questa configurazione è concesso solo alle app firmate dal gestore.
  • API definita : in precedenza questa configurazione era archiviata principalmente in overlay XML interni all'interno del framework e non tramite un'API pubblica. L'API di configurazione del vettore in Android 6.0 è pubblica e ben definita.

Come funziona

Caricamento del file config

La configurazione dell'operatore telefonico fornita da questa funzione è un insieme di coppie chiave-valore che modificano vari comportamenti relativi alla telefonia nella piattaforma.

L'insieme di valori per un particolare dispositivo viene determinato interrogando i seguenti componenti in ordine:

  1. L'app del gestore (questa è facoltativa, ma è la posizione consigliata per una configurazione aggiuntiva oltre a quella esistente nel progetto Android Open Source (AOSP))
  2. L'app di configurazione della piattaforma in bundle con l'immagine del sistema
  3. Valori predefiniti, codificati nel framework (equivalenti al comportamento precedente ad Android 6.0)

L'app di configurazione della piattaforma

Un'app di configurazione della piattaforma generica è inclusa nell'immagine del sistema. Questa app può fornire valori per tutte le variabili che l'app dell'operatore normale non fa. L'app di configurazione della piattaforma può essere trovata (in Android 6.0) in: packages/apps/CarrierConfig

Lo scopo di questa app è fornire alcune configurazioni per rete quando un'app operatore non è installata e gli operatori / OEM dovrebbero apportare solo modifiche minime alle proprie immagini. I vettori dovrebbero invece fornire l'app separata per la personalizzazione dell'operatore, consentendo la distribuzione degli aggiornamenti attraverso vie come gli app store.

Come viene concesso il privilegio a un'app del gestore

L'app dell'operatore in questione deve essere firmata con lo stesso certificato presente sulla scheda SIM, come documentato in Privilegi dell'operatore UICC .

Quali informazioni vengono passate all'app dell'operatore

L'app del gestore viene fornita con i seguenti valori, che le consentono di prendere una decisione dinamica su quali valori restituire:

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • ID operatore

Per ulteriori informazioni sull'integrazione degli ID operatore, vedere Integrazione degli ID operatore con CarrierConfig .

Quando si carica la configurazione del vettore

La creazione dell'elenco delle coppie chiave-valore avviene:

  • Quando la SIM è caricata (avvio o SIM hot swap)
  • Quando l'app dell'operatore attiva manualmente un ricaricamento
  • Quando l'app dell'operatore viene aggiornata

Vedere il riferimento android.service.carrier.CarrierService#onLoadConfig() per ulteriori dettagli.

Utilizzando il file config

Quando la configurazione viene creata, i valori in essa contenuti vengono utilizzati per impostare vari valori di configurazione del sistema, tra cui:

  • Impostazioni telefoniche del framework interno
  • Valori di configurazione restituiti dall'SDK, ad esempio, in SmsManager
  • Impostazioni dell'app come i valori di connessione VVM nel dialer

Chiavi di configurazione

L'elenco delle chiavi è definito come parte dell'SDK pubblico in android.telephony.CarrierConfigManager e non può essere modificato all'interno dello stesso livello API. Vedere la tabella seguente per un riepilogo delle chiavi.

Costruire l'app

Creazione dell'app

La tua app deve avere come target il livello API di Android 6.0 (23).

Dichiarazione di una classe che sostituisce android.service.carrier.CarrierService

  1. onLoadConfig override di onLoadConfig per restituire i valori che si desidera fornire in base all'oggetto service.carrier.CarrierIdentifier passato.
  2. Aggiungi logica per chiamare notifyConfigChangedForSubId negli scenari in cui la configurazione del gestore può cambiare nel tempo (ad esempio, quando l'utente aggiunge servizi extra al proprio account).

Di seguito un esempio:

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;
    }
}

Per ulteriori dettagli, vedere il riferimento android.service.carrier.CarrierService .

Denominazione della classe nel manifest

Di seguito un esempio:

<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>

Firmare l'app con lo stesso certificato sulla SIM

Vedere Privilegi operatore UICC per i requisiti.

Aggiunta di APN con un'app del gestore

Per aggiungere APN a livello di codice da un'app operatore (ad esempio, durante l'attivazione della SIM), utilizza ContentResolver API ContentResolver per aggiungere elementi APN a un provider di contenuti identificato dall'URI android.provider.Telephony.Carriers.CONTENT_URI . Per ulteriori informazioni sulla struttura della tabella per l'URI del contenuto, vedere Telephony.Carriers .

Per ulteriori informazioni, vedere APN e CarrierConfig .

Testare l'app

Dopo aver creato la tua app di configurazione, puoi testare il tuo codice con:

  • Una SIM contenente una firma di certificato valida
  • Un dispositivo con Android 6.0 e versioni successive, ad esempio un dispositivo Android