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:
- L'app dell'operatore (facoltativa, ma è la posizione consigliata per una configurazione aggiuntiva oltre a quella esistente nell'Android Open Source Project (AOSP))
- L'app di configurazione della piattaforma inclusa nell'immagine di sistema
- 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
- Sostituisci
onLoadConfig
per restituire i valori che vuoi fornire in base all'oggettoservice.carrier.CarrierIdentifier
passato. - 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
ContentResolver
API 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() |