Android 6.0 y versiones posteriores incluyen una función para que las apps con privilegios proporcionen configuración específica del operador a la plataforma. Esta funcionalidad, basada en los privilegios de proveedor de UICC que se introdujeron en Android 5.1 (Lollipop MR1), permite que la configuración del operador se aleje de las superposiciones de configuración estática y brinda a los operadores y OEM la capacidad de proporcionar de forma dinámica la configuración de operadores a la plataforma a través de una interfaz definida.
Una app de operador firmada correctamente puede cargarse previamente en la imagen del sistema, instalarse automáticamente o de forma manual a través de una tienda de aplicaciones. La plataforma consulta la app para proporcionar la configuración de los parámetros, incluidos los siguientes:
- Redes con roaming o sin roaming
- Buzón de voz visual
- Configuración de red de SMS/MMS
- Parámetros de configuración de VoLTE/IMS
La determinación de qué valores devolver depende exclusivamente de la app del operador y puede ser dinámica en función de la información detallada que se pasa a la app a través de la plataforma.
Los beneficios clave de este enfoque son los siguientes:
- Configuración dinámica: Compatibilidad con conceptos como la configuración no derivada de MCCMNC, por ejemplo, operadores de redes virtuales móviles (MVNO) o la habilitación de servicios adicionales por parte del cliente.
- Compatibilidad con dispositivos vendidos a través de cualquier canal: Por ejemplo, un teléfono del mercado abierto se puede configurar automáticamente con la configuración correcta si se descarga una app de una tienda de aplicaciones.
- Seguridad: El privilegio para proporcionar esta configuración se otorga solo a las apps firmadas por el proveedor.
- API definida: Anteriormente, esta configuración se almacenaba, en su mayoría, en superposiciones XML internas dentro del framework 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
Carga la configuración
La configuración del operador que proporciona esta función es un conjunto de pares clave-valor que cambian varios comportamientos relacionados con la telefonía en la plataforma.
Para determinar el conjunto de valores de un dispositivo en particular, se consultan los siguientes componentes en orden:
- La app del operador (esto es opcional, pero es la ubicación recomendada para realizar configuraciones adicionales más allá de la que existe en el Proyecto de código abierto de Android [AOSP])
- La app de configuración de la plataforma incluida en la imagen del sistema
- Valores predeterminados, codificados en el framework (equivalentes al comportamiento anterior a Android 6.0)
La app de configuración de la plataforma
Una app de configuración de plataforma genérica se incluye en la imagen del sistema. Esta app puede proporcionar valores para cualquier variable que no tenga la app del operador normal. La app de configuración de la plataforma se puede encontrar (en Android 6.0) en: packages/apps/CarrierConfig
El propósito de esta app es proporcionar cierta configuración por red cuando no se instala una app del operador, y los operadores o OEM solo deben realizar cambios mínimos en sus propias imágenes. En cambio, los operadores deben proporcionar la app del operador independiente para la personalización del operador, lo que permite que las actualizaciones se distribuyan a través de vías como las tiendas de aplicaciones.
Cómo se otorga privilegio a una app del operador
La app del operador en cuestión debe estar firmada con el mismo certificado que se encuentra en la tarjeta SIM, como se documenta en Privilegios del operador de UICC.
Qué información se transmite a la app del operador
La app del operador se proporciona con los siguientes valores, lo que le permite tomar una decisión dinámica sobre qué valores mostrar:
- MCC
- MNC
- SPN
- IMSI
- IDG1
- IDG2
- ID del operador
Para obtener más información sobre la integración de IDs de operador, consulta Integración de IDs de operador con CarrierConfig.
Cuando se carga la configuración del operador
La lista de pares clave-valor se compila de la siguiente manera:
- Cuando se carga la SIM (inicio o cambio en caliente de la SIM)
- Cuando la app del operador activa una recarga de forma manual
- Cuando se actualiza la app del operador
Consulta la referencia de
android.service.carrier.CarrierService#onLoadConfig()
para obtener más detalles.
Usa la configuración
Cuando se compila la configuración, los valores que contiene se usan para establecer varios valores de configuración del sistema, incluidos los siguientes:
- Configuración de telefonía del framework interno
- Valores de configuración que muestra el SDK, por ejemplo, en SmsManager
- Configuración de la app, como los valores de conexión de VVM en el Dialer
Claves de configuración
La lista de claves se define como parte del SDK público en android.telephony.CarrierConfigManager
y no puede cambiar dentro del mismo nivel de API. Consulta la siguiente tabla para ver un resumen de las claves.
Compila la app
Crea la app
Tu app debe tener como objetivo el nivel de API de Android 6.0 (23).
Declara una clase que anule android.service.carrier.CarrierService
- Anula
onLoadConfig
para mostrar los valores que deseas proporcionar en función del objetoservice.carrier.CarrierIdentifier
que se pasó. - Agrega lógica para llamar a
notifyConfigChangedForSubId
en situaciones en las que la configuración del operador pueda cambiar con el tiempo (por ejemplo, cuando el usuario agrega servicios adicionales a su cuenta).
A continuación, se incluye 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 información, consulta la referencia de android.service.carrier.CarrierService
.
Asigna un nombre a la clase en el manifiesto
A continuación, se incluye 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>
Firma la app con el mismo certificado en la SIM
Consulta Privilegios de operador de UICC para conocer los requisitos.
Agrega APN con una app de operador
Para agregar APNS de manera programática desde una app de operador (por ejemplo, durante la activación de SIM), usa las
APIs de 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 del URI de contenido, consulta Telephony.Carriers
.
Para obtener más información, consulta APN y CarrierConfig.
Probar la app
Una vez que hayas compilado tu app de configuración, puedes probar tu código con lo siguiente:
- Una SIM que contenga una firma de certificado válida
- Un dispositivo con Android 6.0 o versiones posteriores, por ejemplo, un dispositivo Android
Cómo establecer las funciones del servicio de operador
En Android, las capacidades de servicio del operador describen si un dispositivo admite servicios de voz, mensajería y datos. Los operadores pueden especificar las capacidades del servicio del operador para un dispositivo a nivel del dispositivo y a nivel de la suscripción (Android 15 o versiones posteriores).
Funciones del servicio a nivel del dispositivo
Las capacidades de servicio a nivel del dispositivo se configuran durante la fabricación del dispositivo (no se pueden cambiar después de la fabricación). Los operadores pueden especificar capacidades a nivel del dispositivo mediante las siguientes anulaciones de recursos del sistema:
Las apps pueden consultar las capacidades de servicio a nivel del dispositivo a través de las siguientes APIs:
Funciones del servicio a nivel de la suscripción
En el caso de los dispositivos que ejecutan Android 15 o versiones posteriores, los operadores pueden especificar las capacidades de servicio del dispositivo a nivel de suscripción. Para especificar las capacidades del servicio a nivel de suscripción, usa la API de
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
. Por ejemplo, para especificar que una suscripción es solo de datos, establece el valor en
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Las apps (apps del sistema precargadas y de terceros) pueden consultar las capacidades del servicio del operador para una suscripción especificada a través del método
SubscriptionInfo.getServiceCapabilities()
. Esto permite que los desarrolladores de apps personalicen la experiencia del usuario de las apps según las funciones disponibles para la suscripción. Por ejemplo, los desarrolladores de apps pueden asegurarse de que la app de Teléfono no permita realizar llamadas si el usuario tiene una suscripción de solo datos.
APIs de funciones de servicio obsoletas
A partir de Android 15, Android proporciona capacidades de servicio a nivel del dispositivo y a nivel de la suscripción. Debido a este cambio, se cambió el nombre de las APIs de capacidades existentes a nivel del dispositivo para mejorar la legibilidad. En la siguiente tabla, se enumeran las APIs obsoletas y las que cambiaron de nombre que se introdujeron en Android 15:
Obsoleto (Android 14 o versiones anteriores) | Equivalente (Android 15 o versiones posteriores) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |