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 spostare la configurazione dell'operatore dai overlay di configurazione statica e offre a operatori e OEM la possibilità di fornire dinamicamente la configurazione dell'operatore alla piattaforma tramite un'interfaccia definita.
Un'app operatore firmata correttamente può essere precaricata nell'immagine di sistema, installata automaticamente o installata 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 dipende interamente dall'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 mobile virtuale (MVNO) o l'attivazione da parte del cliente di servizi aggiuntivi.
- Supporto per i dispositivi venduti tramite qualsiasi canale: ad esempio, uno smartphone acquistato sul mercato aperto può essere configurato automaticamente con le impostazioni corrette scaricando un'app da uno 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 Carrier Config 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 correlati alla telefonia nella piattaforma.
Il set 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 la configurazione aggiuntiva oltre a quella esistente in Android Open Source Project (AOSP))
- L'app di configurazione della piattaforma inclusa nell'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 qualsiasi variabile che l'app operatore standard non fornisce. L'app di configurazione della piattaforma
si trova (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 devono invece fornire l'app operatore separata per la personalizzazione, consentendo la distribuzione degli aggiornamenti tramite canali come gli store.
Come viene concesso il privilegio a un'app operatore
L'app dell'operatore in questione deve essere firmata con lo stesso certificato presente sulla scheda SIM, come documentato in Privilegi dell'operatore UICC.
Quali informazioni vengono trasmesse all'app dell'operatore
L'app dell'operatore viene fornita con i seguenti valori, il che le consente di prendere una decisione dinamica su quali valori restituire:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- ID operatore
Per ulteriori informazioni sull'integrazione degli ID operatore, consulta Integrazione degli ID operatore con CarrierConfig.
Quando si verifica il caricamento della configurazione dell'operatore
La creazione dell'elenco di coppie chiave-valore avviene:
- Quando la SIM viene caricata (avvio o sostituzione a caldo della SIM)
- Quando l'app dell'operatore attiva manualmente un ricaricamento
- Quando l'app dell'operatore viene aggiornata
Per ulteriori dettagli, consulta il riferimento
android.service.carrier.CarrierService#onLoadConfig()
.
Utilizzare la configurazione
Quando la configurazione viene creata, i valori contenuti al suo interno 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, ad esempio 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. Per un riepilogo dei tasti, consulta la tabella riportata di seguito.
Crea l'app
Crea l'app
La tua app deve avere come target il livello API Android 6.0 (23).
Dichiara una classe che esegue l'override di android.service.carrier.CarrierService
- Esegui l'override di
onLoadConfig
per restituire i valori che vuoi fornire in base all'oggettoservice.carrier.CarrierIdentifier
trasmesso. - 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 maggiori dettagli, consulta il
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 operatore UICC.
Aggiungere APN con un'app operatore
Per aggiungere APN in modo programmatico da un'app 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, vedi
Telephony.Carriers
.
Per saperne di più, consulta APN e CarrierConfig.
Testare 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
Impostare le funzionalità del servizio di corriere
In Android, le funzionalità dei servizi operatore descrivono se i servizi 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 a livello di abbonamento (Android 15 o versioni successive).
Funzionalità di servizio a livello di dispositivo
Le funzionalità del servizio a livello di dispositivo vengono configurate durante la produzione di un dispositivo (non possono essere modificate dopo la produzione). Gli operatori possono specificare le funzionalità a livello di dispositivo tramite i seguenti override delle risorse di sistema:
Le app possono eseguire query sulle funzionalità del 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 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 specifico 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 delle funzionalità di servizio deprecate
A partire da Android 15, Android fornisce funzionalità di servizio a livello di dispositivo e di abbonamento. A causa di questa modifica, le API delle funzionalità a livello di dispositivo esistenti sono state rinominate per una migliore leggibilità. La tabella seguente elenca le API ritirate e quelle rinominate introdotte in Android 15:
Obsoleto (Android 14 o versioni precedenti) | Equivalente (Android 15 o versioni successive) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |