Configuración del proveedor

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 función, basada en los privilegios del operador de UICC que se introdujeron en Android 5.1 (Lollipop MR1), permite que la configuración del operador se quite de las superposiciones de configuración estáticas y les brinda a los operadores y OEMs la capacidad de proporcionar la configuración del operador de forma dinámica a la plataforma a través de una interfaz definida.

Una app del operador firmada correctamente se puede precargar en la imagen del sistema, instalar automáticamente o instalar 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 en roaming o no
  • Buzón de voz visual
  • Configuración de red de SMS/MMS
  • Configuraciones de VoLTE/IMS

La determinación de qué valores mostrar depende completamente 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 derivada de MCCMNC, por ejemplo, operadores de red virtual móvil (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 de 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 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:

  1. La app del operador (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))
  2. La app de configuración de la plataforma incluida en la imagen del sistema
  3. 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 OEMs 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 un 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 pasa 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
  • GID1
  • GID2
  • 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 compilación de la lista de pares clave-valor ocurre 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 orientarse al nivel de API de Android 6.0 (23).

Declara una clase que anule android.service.carrier.CarrierService.

  1. Anula onLoadConfig para mostrar los valores que deseas proporcionar según el objeto service.carrier.CarrierIdentifier que se pasó.
  2. 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 información, consulta la referencia de android.service.carrier.CarrierService.

Asigna un nombre a 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 Privilegios de operador de UICC para conocer los requisitos.

Cómo agregar APN con una app del 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, puedes probar el 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 funciones 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 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 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:

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 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 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 a los desarrolladores de apps personalizar 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 del dialer no permita realizar llamadas si el usuario tiene una suscripción solo de datos.

APIs de funciones de servicio obsoletas

A partir de Android 15, Android proporciona funciones 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()