Android 6.0 y versiones posteriores incluyen una capacidad para que las aplicaciones privilegiadas proporcionen una configuración específica del operador a la plataforma. Esta funcionalidad, basada en los privilegios de operador UICC introducidos en Android 5.1 (Lollipop MR1), permite alejar la configuración del operador de las superposiciones de configuración estática y brinda a los operadores y OEM la capacidad de proporcionar dinámicamente la configuración del operador a la plataforma a través de una interfaz definida.
Una aplicación de operador debidamente firmada puede precargarse en la imagen del sistema, instalarse automáticamente o instalarse manualmente a través de una tienda de aplicaciones. La plataforma solicita a la aplicación que proporcione configuración para ajustes que incluyen:
- Redes itinerantes/no itinerantes
- Correo de voz visual
- Configuración de red SMS/MMS
- Configuraciones VoLTE/IMS
La determinación de qué valores devolver depende totalmente de la aplicación del operador y puede ser dinámica en función de la información detallada transmitida a la aplicación a través de la plataforma.
Los beneficios clave de este enfoque son:
- Configuración dinámica : soporte para conceptos como configuración no derivada de MCCMNC, por ejemplo, operadores de redes virtuales móviles (MVNO) o el cliente opta por servicios adicionales.
- Soporte para dispositivos vendidos a través de cualquier canal : por ejemplo, un teléfono de mercado abierto se puede configurar automáticamente con los ajustes correctos descargando una aplicación desde una tienda de aplicaciones.
- Seguridad : el privilegio de proporcionar esta configuración se otorga únicamente a las aplicaciones firmadas por el operador.
- API definida : anteriormente, esta configuración se almacenaba principalmente en superposiciones XML internas dentro del marco y no a través de una API pública. La API de configuración del operador en Android 6.0 es pública y está bien definida.
Cómo funciona
Cargando la configuración
La configuración del operador proporcionada por esta función es un conjunto de pares clave-valor que cambian varios comportamientos relacionados con la telefonía en la plataforma.
El conjunto de valores para un dispositivo en particular se determina consultando los siguientes componentes en orden:
- La aplicación del operador (esto es opcional, pero es la ubicación recomendada para configuraciones adicionales más allá de lo que existe en el Proyecto de código abierto de Android (AOSP))
- La aplicación de configuración de la plataforma incluida con la imagen del sistema.
- Valores predeterminados, codificados en el marco (equivalentes al comportamiento anterior a Android 6.0)
La aplicación de configuración de la plataforma
Se incluye una aplicación de configuración de plataforma genérica con la imagen del sistema. Esta aplicación puede proporcionar valores para cualquier variable que la aplicación del operador normal no proporciona. La aplicación de configuración de la plataforma se puede encontrar (en Android 6.0) en: packages/apps/CarrierConfig
El propósito de esta aplicación es proporcionar alguna configuración por red cuando una aplicación de operador no está instalada, y los operadores/OEM deben realizar solo cambios mínimos en sus propias imágenes. En su lugar, los operadores deberían proporcionar una aplicación de operador independiente para personalizarlo, permitiendo que las actualizaciones se distribuyan a través de vías como las tiendas de aplicaciones.
Cómo se otorgan privilegios a una aplicación de operador
La aplicación del operador en cuestión debe estar firmada con el mismo certificado que se encuentra en la tarjeta SIM, como se documenta en UICC Carrier Privileges .
Qué información se pasa a la aplicación del operador
La aplicación del operador se proporciona con los siguientes valores, lo que le permite tomar una decisión dinámica sobre qué valores devolver:
- MCC
- multinacional
- SPN
- IMSI
- GID1
- GID2
- ID del operador
Para obtener más información sobre la integración de ID de operador, consulte Integración de ID de operador con CarrierConfig .
Al cargar se produce la configuración del operador.
La construcción de la lista de pares clave-valor ocurre:
- Cuando la SIM está cargada (arranque o intercambio en caliente de SIM)
- Cuando la aplicación del operador activa manualmente una recarga
- Cuando se actualiza la aplicación del operador
Consulte la referencia android.service.carrier.CarrierService#onLoadConfig()
para obtener más detalles.
Usando la configuración
Cuando se crea la configuración, los valores contenidos en ella se utilizan para establecer varios valores de configuración del sistema, incluidos:
- Configuración de telefonía del marco interno
- Valores de configuración devueltos por el SDK, por ejemplo, en SmsManager
- Configuraciones de aplicaciones como valores de conexión VVM en el Marcador
Claves de configuración
La lista de claves se define como parte del SDK público en android.telephony.CarrierConfigManager
y no se puede cambiar dentro del mismo nivel de API. Consulte la siguiente tabla para obtener un resumen de las claves.
Construyendo la aplicación
Creando la aplicación
Su aplicación debe tener como objetivo el nivel API de Android 6.0 (23).
Declarar una clase que anula android.service.carrier.CarrierService
- Anule
onLoadConfig
para devolver los valores que desea proporcionar en función del objetoservice.carrier.CarrierIdentifier
pasado. - Agregue lógica para llamar
notifyConfigChangedForSubId
en escenarios donde la configuración del operador puede cambiar con el tiempo (por ejemplo, cuando el usuario agrega servicios adicionales a su cuenta).
A continuación se muestra un ejemplo:
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; } }
Para obtener más detalles, consulte la referencia de android.service.carrier.CarrierService
.
Nombrar la clase en el manifiesto
A continuación se muestra un ejemplo:
<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>
Firmar la aplicación con el mismo certificado en la SIM
Consulte Privilegios de operador de UICC para conocer los requisitos.
Agregar APN con una aplicación de operador
Para agregar APN mediante programación desde una aplicación de operador (por ejemplo, durante la activación de SIM), use las API ContentResolver
para agregar elementos de APN a un proveedor de contenido identificado por el URI android.provider.Telephony.Carriers.CONTENT_URI
. Para obtener más información sobre la estructura de la tabla para el URI de contenido, consulte Telephony.Carriers
.
Para obtener más información, consulte APN y CarrierConfig .
Probando la aplicación
Cuando haya creado su aplicación de configuración, puede probar su código con:
- Una tarjeta SIM que contenga una firma de certificado válida
- Un dispositivo con Android 6.0 y posterior, por ejemplo un dispositivo Android