Configurazione gestore di telefonia mobile

Android 6.0 e versioni successive includono una funzionalità che consente alle app con privilegi di fornire alla piattaforma una configurazione specifica dell'operatore. 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 tramite un'interfaccia definita.

Un'app dell'operatore firmata correttamente può essere precaricata nell'immagine di sistema, installata automaticamente o installata manualmente tramite un app store. La piattaforma esegue una query sull'app per fornire la configurazione delle impostazioni, tra cui:

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

La determinazione dei valori da restituire dipende interamente dall'app dell'operatore 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 la configurazione non derivata da MCCMNC, ad esempio, operatori di rete mobile virtuale (MVNO) o consenso esplicito del cliente a servizi aggiuntivi.
  • Supporto per i dispositivi venduti tramite qualsiasi canale : ad esempio, un telefono venduto sul mercato aperto può essere configurato automaticamente con le impostazioni corrette scaricando un'app da un app store.
  • Sicurezza : il privilegio di fornire questa configurazione viene concesso solo alle app firmate dall'operatore.
  • API definita : in precedenza, questa configurazione veniva archiviata principalmente in overlay XML interni all'interno del framework e non tramite un' API pubblica. L'API di configurazione dell'operatore in Android 6.0 è pubblica e ben definita.

Come funziona

Caricare la configurazione

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

L'insieme di valori per un determinato dispositivo viene determinato eseguendo una query sui seguenti componenti in ordine:

  1. L'app dell'operatore (facoltativa, ma è la posizione consigliata per la configurazione aggiuntiva oltre a quella esistente in Android Open Source Project (AOSP))
  2. L'app di configurazione della piattaforma inclusa nell'immagine di 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 di sistema. Questa app può fornire valori per tutte le variabili che l'app dell'operatore normale non fornisce. L'app di configurazione della piattaforma è disponibile (in Android 6.0) in: packages/apps/CarrierConfig

Lo scopo di questa app è fornire una configurazione per rete quando non è installata un'app dell'operatore e gli operatori/OEM devono apportare solo modifiche minime alle proprie immagini. Gli operatori devono invece fornire l'app dell'operatore separata per la personalizzazione dell'operatore, consentendo la distribuzione degli aggiornamenti tramite canali come gli app store.

Come vengono concessi i privilegi a un'app dell'operatore

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

Quali informazioni vengono trasmesse all'app dell'operatore

L'app dell'operatore riceve i seguenti valori, che le consentono di prendere una decisione dinamica in merito ai valori da restituire:

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

Per ulteriori informazioni sull'integrazione degli ID operatore, vedi Integrare gli ID operatore con CarrierConfig.

Quando viene caricata la configurazione dell'operatore

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

  • Quando la SIM viene caricata (avvio o sostituzione a caldo della SIM)
  • Quando l'app dell'operatore attiva manualmente un ricaricamento
  • Quando l'app dell'operatore viene aggiornata

Per ulteriori dettagli, consulta il android.service.carrier.CarrierService#onLoadConfig() riferimento.

Utilizzare la configurazione

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

  • Impostazioni di telefonia 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. Per un riepilogo delle chiavi, vedi la tabella di seguito.

Creare l'app

Creare l'app

L'app deve avere come target il livello API 23 di Android 6.0.

Dichiarare una classe che esegue l'override di android.service.carrier.CarrierService

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

Di seguito è riportato 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, consulta il android.service.carrier.CarrierService riferimento.

Assegnare un nome alla classe nel manifest

Di seguito è riportato 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 della SIM

Per i requisiti, vedi Privilegi dell'operatore UICC.

Aggiungere APN con un'app dell'operatore

Per aggiungere APN in modo programmatico da un'app dell'operatore (ad esempio, durante l'attivazione della SIM ), utilizza ContentResolver API per aggiungere elementi APN a un content provider identificato dall'URI android.provider.Telephony.Carriers.CONTENT_URI. Per ulteriori informazioni sulla struttura della tabella per l'URI contenuto, vedi Telephony.Carriers.

Per ulteriori informazioni, vedi APN e CarrierConfig.

Testare l'app

Dopo aver creato l'app di configurazione, puoi testare il codice con:

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

Impostare le funzionalità del servizio dell'operatore

In Android, le funzionalità del servizio dell'operatore indicano se i servizi voce, messaggistica e dati sono supportati su un dispositivo. Gli operatori possono specificare le funzionalità del servizio dell'operatore per un dispositivo a livello di dispositivo e a livello di abbonamento (Android 15 o versioni successive).

Funzionalità del servizio a livello di dispositivo

Le funzionalità del servizio a livello di dispositivo vengono configurate durante la produzione di un dispositivo (non possono essere modificate dopo la produzione). Gli operatori possono specificare le funzionalità a livello di dispositivo tramite i seguenti override delle risorse di sistema:

Le app possono eseguire una query sulle funzionalità del servizio a livello di dispositivo tramite le seguenti API:

Funzionalità del servizio a livello di abbonamento

Per i dispositivi con Android 15 o versioni successive, gli operatori possono specificare le funzionalità del servizio del dispositivo a livello di abbonamento. Per specificare le funzionalità del servizio a livello di abbonamento, utilizza l' CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY API. Ad esempio, per specificare che un abbonamento è solo dati, imposta il valore su SubscriptionManager#SERVICE_CAPABILITY_DATA.

Le app (app di sistema precaricate e app di terze parti) possono eseguire una query sulle funzionalità del servizio dell'operatore per un abbonamento specificato tramite il SubscriptionInfo.getServiceCapabilities() metodo. In questo modo, gli sviluppatori di app possono personalizzare l'esperienza utente delle app in base alle funzionalità disponibili per l'abbonamento. Ad esempio, gli sviluppatori di app possono assicurarsi che l'app Dialer non consenta di effettuare chiamate se l'utente ha un abbonamento solo dati.

API delle funzionalità del servizio obsolete

A partire da Android 15, Android fornisce funzionalità del servizio sia a livello di dispositivo sia a livello di abbonamento. A causa di questa modifica, le API delle funzionalità a livello di dispositivo esistenti sono state rinominate per una migliore leggibilità. La tabella seguente elenca le API obsolete e le API rinominate introdotte in Android 15:

Obsolete (Android 14 o versioni precedenti) Equivalenti (Android 15 o versioni successive)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()