Configuración del operador

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:

  1. 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))
  2. La aplicación de configuración de la plataforma incluida con la imagen del sistema.
  3. 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

  1. Anule onLoadConfig para devolver los valores que desea proporcionar en función del objeto service.carrier.CarrierIdentifier pasado.
  2. 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