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 operatore UICC introdotti in Android 5.1 (Lollipop MR1), consente di rimuovere la configurazione dell'operatore dagli overlay di configurazione statici e offre a operatori e OEM la possibilità di fornire dinamicamente la configurazione dell'operatore alla piattaforma attraverso un'interfaccia definita.

Un'app dell'operatore correttamente firmata può essere precaricata nell'immagine di sistema, installata automaticamente o installata manualmente tramite uno store. La piattaforma richiede che l'app fornisca la configurazione per 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 quali la configurazione derivata non da MCCMNC, ad esempio gli operatori di rete virtuale per dispositivi mobili (MVNO) o l'attivazione di servizi aggiuntivi da parte del cliente.
  • 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 per fornire questa configurazione viene concesso 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 i vari comportamenti relativi alla telefonia nella piattaforma.

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

  1. L'app dell'operatore (facoltativa, ma è la posizione consigliata per ulteriori configurazioni diverse da quelle presenti nell'Android Open Source Project (AOSP))
  2. L'app di configurazione della piattaforma inclusa nell'immagine di sistema
  3. Valori predefiniti impostati come 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 ogni rete quando non è installata l'app dell'operatore. Gli operatori/OEM devono apportare solo modifiche minime nelle proprie immagini. Al contrario, gli operatori dovrebbero fornire l'app dell'operatore separata per la personalizzazione, in modo da distribuire gli aggiornamenti tramite canali come gli store.

Modalità di concessione dei privilegi all'app di un operatore

L'app dell'operatore in questione deve essere firmata con lo stesso certificato riportato sulla scheda SIM, come documentato nella sezione Privilegi 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 operatore

Per maggiori informazioni sull'integrazione degli ID operatore, consulta Integrazione degli ID operatore con CarrierConfig.

Durante il caricamento della configurazione dell'operatore

Si verifica la creazione dell'elenco di coppie chiave-valore:

  • Quando la SIM è caricata (avvio o hot swap della SIM)
  • 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().

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

Chiavi di configurazione

L'elenco delle chiavi è definito nell'ambito dell'SDK pubblico in android.telephony.CarrierConfigManager e non può essere modificato nello stesso livello API. Consulta la tabella seguente per un riepilogo delle chiavi.

Crea l'app

Crea 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. Esegui l'override di onLoadConfig per restituire i valori che vuoi fornire in base all'oggetto service.carrier.CarrierIdentifier superato.
  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 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 APN in modo programmatico dall'app di un operatore (ad esempio, durante l'attivazione della SIM), utilizza le API ContentResolver per aggiungere 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 maggiori 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 e versioni successive, ad esempio un dispositivo Android.

Imposta funzionalità del servizio del corriere

In Android, le funzionalità dei servizi dell'operatore descrivono se i servizi vocali, di messaggistica e di 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à di servizio a livello di dispositivo

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

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

Funzionalità di 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 interrogare le funzionalità del servizio dell'operatore per un abbonamento specifico tramite il metodo SubscriptionInfo.getServiceCapabilities(). In questo modo, gli sviluppatori 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 offre 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()