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:
- L'app dell'operatore (facoltativa, ma è la posizione consigliata per ulteriori configurazioni diverse da quelle presenti nell'Android Open Source Project (AOSP))
- L'app di configurazione della piattaforma inclusa nell'immagine di sistema
- 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
- Esegui l'override di
onLoadConfig
per restituire i valori che vuoi fornire in base all'oggettoservice.carrier.CarrierIdentifier
superato. - 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() |