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 introdotta in Android 5.1 (Lollipop MR1), consente di rimuovere la configurazione dell'operatore dalle sovrapposizioni di configurazione statica e offre ai fornitori di servizi di telefonia mobile 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 manualmente tramite un app store. La piattaforma esegue query sull'app per fornire la configurazione per le impostazioni, tra cui:

  • Reti in roaming/non in roaming
  • Lettura della segreteria
  • Impostazioni di rete SMS/MMS
  • Configurazioni VoLTE/IMS

La determinazione dei valori da restituire è interamente a carico dell'app dell'operatore e può essere dinamica in base alle informazioni dettagliate trasmesse all'app tramite la piattaforma.

I vantaggi principali di questo approccio sono:

  • Configurazione dinamica: supporto di concetti come la configurazione non derivata da MCCMNC, ad esempio gli operatori di rete virtuale mobile (MVNO) o l'attivazione di servizi extra da parte dei clienti.
  • Supporto per i dispositivi venduti tramite qualsiasi canale: ad esempio, un telefono del mercato libero può essere configurato automaticamente con le impostazioni corrette scaricando un'app da un app store.
  • Sicurezza: il privilegio di fornire questa configurazione è dato solo alle app firmate dall'operatore.
  • API definita: in precedenza questa configurazione veniva memorizzata principalmente in overlay XML interni all'ambito del framework e non tramite un'API pubblica. L'API di configurazione dell'operatore in Android 6.0 è pubblica e ben definita.

Come funziona

Carica la configurazione

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

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

  1. L'app dell'operatore (facoltativa, ma è la posizione consigliata per una configurazione aggiuntiva oltre a quella esistente nell'Android Open Source Project (AOSP))
  2. L'app di configurazione della piattaforma inclusa nell'immagine di sistema
  3. Valori predefiniti, hardcoded nel framework (equivalente 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 qualsiasi variabile non supportata dall'app dell'operatore standard. 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 dovrebbero invece fornire un'app separata per la personalizzazione dell'operatore, consentendo la distribuzione degli aggiornamenti tramite canali come gli store.

Come viene concesso il privilegio a un'app dell'operatore

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

Quali informazioni vengono trasmesse all'app dell'operatore

All'app dell'operatore vengono forniti i seguenti valori, che le consentono di prendere una decisione dinamica su quali valori restituire:

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

Per ulteriori informazioni sull'integrazione degli ID corriere, consulta Integrare gli ID corriere con CarrierConfig.

Quando si verifica il caricamento della configurazione dell'operatore

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

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

Per ulteriori dettagli, consulta la documentazione di riferimento android.service.carrier.CarrierService#onLoadConfig().

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 nell'ambito dell'SDK pubblico in android.telephony.CarrierConfigManager e non può cambiare nello stesso livello API. Consulta la tabella seguente per un riepilogo delle chiavi.

Crea l'app

Creare l'app

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

Dichiara una classe che sostituisce android.service.carrier.CarrierService

  1. Sostituisci 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 la documentazione di riferimento android.service.carrier.CarrierService.

Assegna un nome al corso nel file 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>

Firma l'app con lo stesso certificato sulla SIM

Per i requisiti, consulta Privilegi dell'operatore UICC.

Aggiungere APN con un'app dell'operatore

Per aggiungere gli APN in modo programmatico da un'app dell'operatore (ad esempio durante l'attivazione della SIM), utilizza le ContentResolverAPI per aggiungere gli elementi APN a un fornitore di contenuti identificato dall'URI android.provider.Telephony.Carriers.CONTENT_URI. Per ulteriori informazioni sulla struttura della tabella per l'URI dei contenuti, consulta Telephony.Carriers.

Per ulteriori informazioni, consulta APN e CarrierConfig.

Testa 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 o versioni successive, ad esempio un dispositivo Android

Impostare le funzionalità del servizio dell'operatore

In Android, le funzionalità dei servizi dell'operatore descrivono se i servizi di 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 di abbonamento (Android 15 o versioni successive).

Funzionalità di servizio a livello di dispositivo

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

Le app possono eseguire query sulle funzionalità di 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à di servizio del dispositivo a livello di abbonamento. Per specificare le funzionalità del servizio a livello di abbonamento, utilizza l'API CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY. Ad esempio, per specificare che un abbonamento è solo di dati, imposta il valore su SubscriptionManager#SERVICE_CAPABILITY_DATA.

Le app (app di sistema precaricate e app di terze parti) possono eseguire query sulle funzionalità del servizio dell'operatore per un abbonamento specificato tramite il metodo SubscriptionInfo.getServiceCapabilities(). 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 Telefono non consenta di effettuare chiamate se l'utente ha un abbonamento solo dati.

API di funzionalità di servizio ritirate

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

Ritiro (Android 14 o versioni precedenti) Dispositivo equivalente (Android 15 o versioni successive)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()