Android 6.0 y versiones posteriores incluyen una capacidad para que las apps con privilegios proporcionen configuración específica del operador a la plataforma. Esta función, basada en los privilegios de operador de la 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 dinámicamente la configuración del operador a la plataforma a través de una interfaz definida.
Una app de operador firmada correctamente se puede precargar en la imagen del sistema, instalar automáticamente o instalar manualmente a través de una tienda de aplicaciones. La plataforma consulta la app para proporcionar la configuración de los siguientes parámetros:
- Redes en roaming y sin roaming
- Buzón de voz visual
- Configuración de red de SMS/MMS
- Configuraciones de VoLTE/IMS
La app de la aerolínea determina qué valores devolver y puede ser dinámica según la información detallada que se le pasa a la app a través de la plataforma.
Estos son los beneficios clave de este enfoque:
- Configuración dinámica: Compatibilidad con conceptos como la configuración no derivada de MCCMNC, por ejemplo, operadores de redes virtuales móviles (OMV) o la aceptación del cliente para recibir servicios adicionales.
- Compatibilidad con dispositivos vendidos a través de cualquier canal: Por ejemplo, un teléfono de mercado abierto se puede configurar automáticamente con los parámetros de configuración correctos descargando una app de una tienda de aplicaciones.
- Seguridad: El privilegio para proporcionar esta configuración solo se otorga a las apps firmadas por el operador.
- API definida: Anteriormente, esta configuración se almacenaba principalmente en superposiciones XML internas dentro del framework y no a través de una API pública. La API de CarrierConfig 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.
El conjunto de valores para un dispositivo en particular se determina consultando los siguientes componentes en orden:
- La app del operador (es opcional, pero es la ubicación recomendada para la configuración adicional más allá de lo 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 de forma rígida en el framework (equivalente al comportamiento anterior a Android 6.0)
La app de configuración de la plataforma
Una app de configuración genérica de la plataforma se incluye en la imagen del sistema. Esta app puede proporcionar valores para cualquier variable que la app de operador habitual no proporcione. 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 de operador, y los operadores o los OEM solo deben realizar cambios mínimos en ella en sus propias imágenes. En cambio, los operadores deben proporcionar la app independiente del operador para la personalización, lo que permite que las actualizaciones se distribuyan a través de canales como las tiendas de apps.
Cómo se otorgan privilegios a una app de operador
La app de operador en cuestión debe estar firmada con el mismo certificado que se encuentra en la tarjeta SIM, como se documenta en Privilegios de operador de la UICC.
Qué información se pasa a la app del operador
La app de la empresa de transporte se suministra con los siguientes valores, lo que le permite tomar una decisión dinámica sobre qué valores devolver:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- ID de operador
Para obtener más información sobre la integración de IDs de operador, consulta Cómo integrar IDs de operador con CarrierConfig.
Cuándo se carga la configuración del operador
La lista de pares clave-valor se crea de la siguiente manera:
- Cuando se carga la SIM (arranque o intercambio en caliente de la SIM)
- Cuando la app de la empresa de transporte activa manualmente una recarga
- Cuando se actualiza la app de la empresa de telefonía celular
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 interna del framework de telefonía
- Valores de configuración que devuelve el SDK, por ejemplo, en SmsManager
- Parámetros de configuración de la app, como los valores de conexión del 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 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 23 de Android 6.0.
Declara una clase que anule android.service.carrier.CarrierService
- Anula
onLoadConfig
para devolver los valores que deseas proporcionar según el objetoservice.carrier.CarrierIdentifier
que se pasó. - Agrega lógica para llamar a
notifyConfigChangedForSubId
en situaciones en las que 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, consulta la referencia de android.service.carrier.CarrierService
.
Cómo 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>
Firma la app con el mismo certificado en la SIM
Consulta los Privilegios de proveedor de UICC para conocer los requisitos.
Cómo agregar APNs con una app de operador
Para agregar APN de forma programática desde una app del operador (por ejemplo, durante la activación de la 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
Cuando hayas compilado tu app de configuración, podrás probar tu código con las siguientes opciones:
- 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 capacidades del servicio de la empresa de transporte
En Android, las capacidades de los servicios del operador describen si los servicios de voz, mensajería y datos son compatibles con un dispositivo. Los operadores pueden especificar las capacidades de servicio del operador para un dispositivo a nivel del dispositivo y a nivel de la suscripción (Android 15 o versiones posteriores).
Capacidades de servicio a nivel del dispositivo
Las capacidades de servicio a nivel del dispositivo se configuran cuando se fabrica un dispositivo (no se pueden cambiar después de la fabricación). Los operadores pueden especificar capacidades a nivel del dispositivo a través de 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:
Capacidades de 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 la suscripción. Para especificar las capacidades del servicio a nivel de la 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 apps de terceros) pueden consultar las capacidades del servicio del operador para una suscripción específica 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 capacidades disponibles para la suscripción. Por ejemplo, los desarrolladores de apps pueden asegurarse de que la app de marcador no permita realizar llamadas si el usuario tiene una suscripción solo de datos.
APIs de capacidades de servicio obsoletas
A partir de Android 15, Android proporciona capacidades de servicio a nivel del dispositivo y de la suscripción. Debido a este cambio, se renombraron las APIs de capacidades existentes a nivel del dispositivo para mejorar la legibilidad. En la siguiente tabla, se enumeran las APIs que quedaron obsoletas y las APIs renombradas 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() |