Android 6.0 e versioni successive includono una funzionalità per le app privilegiate 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 lontano 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 dell'operatore 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 in roaming/non in roaming
- Segreteria visiva
- Impostazioni di rete SMS/MMS
- Configurazioni VoLTE/IMS
La determinazione di quali valori restituire dipende interamente dall'app dell'operatore e può essere dinamica sulla base di 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 virtuale mobile (MVNO) o attivazione del cliente per servizi aggiuntivi.
- Supporto per dispositivi venduti tramite qualsiasi canale - Ad esempio, un telefono open market 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
Caricamento della config
La configurazione dell'operatore 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 nell'ordine:
- L'app dell'operatore (questo è facoltativo, ma è la posizione consigliata per una configurazione aggiuntiva oltre a quella esistente nell'Android Open Source Project (AOSP))
- L'app di configurazione della piattaforma in bundle con l'immagine di sistema
- 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 la normale app del gestore telefonico non fornisce. 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 non è installata un'app dell'operatore e gli operatori/OEM dovrebbero apportare solo modifiche minime alle proprie immagini. Gli operatori dovrebbero invece fornire l'app dell'operatore 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 dell'operatore
L'app dell'operatore in questione deve essere firmata con lo stesso certificato che si trova sulla carta SIM, come documentato in UICC Carrier Privileges .
Quali informazioni vengono trasmesse all'app dell'operatore
L'app del corriere viene fornita con i seguenti valori, consentendole di prendere una decisione dinamica su quali valori restituire:
- MCC
- multinazionale
- SPN
- IMSI
- GID1
- GID2
- ID vettore
Per ulteriori informazioni sull'integrazione degli ID operatore, consulta Integrazione degli ID operatore con CarrierConfig .
Durante il caricamento si verifica la configurazione del vettore
La costruzione dell'elenco delle coppie chiave-valore avviene:
- Quando la SIM è caricata (avvio o sostituzione a caldo della SIM)
- Quando l'app del corriere attiva manualmente una ricarica
- Quando l'app dell'operatore viene aggiornata
Vedere il riferimento android.service.carrier.CarrierService#onLoadConfig()
per maggiori dettagli.
Usando la config
Quando la configurazione viene creata, i valori in essa contenuti vengono utilizzati per impostare vari valori di configurazione del 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ò cambiare 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 esegue l'override di android.service.carrier.CarrierService
- Eseguire l'override di
onLoadConfig
per restituire i valori che si desidera fornire in base all'oggettoservice.carrier.CarrierIdentifier
passato. - Aggiungi la logica per chiamare
notifyConfigChangedForSubId
in scenari in cui la configurazione dell'operatore può cambiare nel tempo (ad esempio, quando l'utente aggiunge servizi aggiuntivi al proprio account).
Un esempio è di seguito:
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
.
Assegnare un nome alla classe nel manifest
Un esempio è di seguito:
<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 dell'app con lo stesso certificato su SIM
Vedere i privilegi del vettore UICC per i requisiti.
Aggiunta di APN con un'app dell'operatore
Per aggiungere APN a livello di codice da un'app dell'operatore (ad esempio, durante l'attivazione della SIM), utilizza le 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