Configuración del proveedor

Android 6.0 y las versiones posteriores incluyen una función para usuarios para proporcionar una configuración específica de operador a la plataforma. Esta funcionalidad, según los Privilegios de proveedor de UICC que se introdujo en Android 5.1 (Lollipop MR1), permite de configuración se aleje de las superposiciones de configuración estática y ofrece a los operadores y OEM la capacidad de proporcionar dinámicamente la configuración de operadores a la plataforma a través de una interfaz definida.

Se puede precargar una app de operador correctamente firmada en la imagen del sistema instalarse automáticamente o de forma manual mediante una tienda de aplicaciones. La app es consultada por la plataforma para proporcionar la configuración como:

  • 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 pueden ser dinámicos según la información detallada que se pasa a la aplicación a través del plataforma.

Los beneficios clave de este enfoque son los siguientes:

  • Configuración dinámica: Compatibilidad con conceptos como configuración derivada de MCCMNC, por ejemplo, operadores de redes virtuales móviles (MVNO) o los clientes aceptan servicios adicionales.
  • Compatibilidad con dispositivos que se venden a través de cualquier canal (por ejemplo, una el teléfono de mercado abierto pueden configurarse automáticamente con el descarga una app de la tienda de aplicaciones.
  • Seguridad: El privilegio para proporcionar esta configuración es se proporcionan solo a las apps firmadas por el proveedor.
  • API definida: Anteriormente, esta configuración se almacenaba principalmente en superposiciones XML internas dentro del framework y no a través de un en la API de Cloud. La API de configuración de proveedores en Android 6.0 es pública y está bien definida.

Cómo funciona

Carga la configuración

La configuración de la empresa de transporte 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 concreto se determina consultando los siguientes componentes en orden:

  1. La app del operador (esto es opcional, pero es la opción para realizar una configuración adicional más allá de la que existe en Proyecto fuente (AOSP))
  2. La app de configuración de la plataforma empaquetada con 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

Se incluye una app genérica de configuración de plataforma con la imagen del sistema. Esta aplicación puede proporcionar para cualquier variable que la app de operador normal no admita. La configuración de la plataforma se puede encontrar la aplicación (en Android 6.0) en: packages/apps/CarrierConfig

El propósito de esta app es proporcionar cierta configuración por red cuando un proveedor La app no está instalada, y los operadores y OEM solo deben hacerle cambios mínimos. en sus propias imágenes. En su lugar, los operadores deben proporcionar la app del operador independiente para la personalización de operadores, lo que permite que las actualizaciones se distribuyan a través de vías como como 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 de proveedor de UICC.

Qué información se transmite a la app del operador

La app del operador incluye los siguientes valores, lo que le permite realizar una dinámica sobre qué valores devolver:

  • MCC
  • MNC
  • SPN
  • IMSI
  • IDG1
  • IDG2
  • ID de la empresa de transporte

Para obtener más información sobre cómo integrar IDs de empresas de transporte, consulta Cómo integrar los IDs de operadores con CarrierConfig

Cuando se carga la configuración de la empresa de transporte

La lista de pares clave-valor se compila de la siguiente manera:

  • Cuando la SIM está cargada (inicio o intercambio directo de la SIM)
  • Cuando la app del operador activa una recarga de forma manual
  • Cuando se actualiza la app del operador

Consulta el android.service.carrier.CarrierService#onLoadConfig() para conocer más detalles.

Usa la configuración

Cuando se crea la configuración, se usan los valores que contiene 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
  • La configuración de la app, como los valores de conexión de VVM en el Teléfono

Claves de configuración

La lista de claves se define como parte del SDK público en android.telephony.CarrierConfigManager y no pueden 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 que se muestren los valores que deseas. basado en el objeto service.carrier.CarrierIdentifier aprobado.
  2. Agrega lógica para llamar a notifyConfigChangedForSubId en situaciones. donde la configuración del operador puede cambiar con el tiempo (por ejemplo, cuando el 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 detalles, consulta la android.service.carrier.CarrierService referencia.

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 SIM

Consulta los Privilegios de proveedor de UICC para las y los requisitos de cumplimiento.

Agrega APN con una app de operador

Para agregar APNs de manera programática desde la app de un operador (por ejemplo, durante la SIM activación), usa APIs de ContentResolver para agregar elementos de APN a un proveedor de contenido identificados por el URI android.provider.Telephony.Carriers.CONTENT_URI Si deseas obtener más información sobre la estructura de la tabla para el 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 el código con:

  • Una SIM que contenga una firma de certificado válida
  • Un dispositivo con Android 6.0 o una versión posterior (por ejemplo, un dispositivo Android)

Cómo configurar las funciones de servicio de la empresa de transporte

En Android, las capacidades del servicio del operador describen si los servicios de voz, y los servicios de datos son compatibles con un dispositivo. Las empresas de transportes pueden especificar capacidades de servicio para un dispositivo a nivel del dispositivo y de la suscripción nivel (Android 15 o versiones posteriores).

Capacidades de servicio a nivel del dispositivo

Las capacidades de servicio a nivel del dispositivo se configuran está fabricado el dispositivo (no se puede cambiar después de la fabricación). Los operadores pueden especificar capacidades a nivel del dispositivo mediante el siguiente recurso del sistema anulaciones:

Las apps pueden consultar las capacidades de servicio a nivel del dispositivo de las siguientes maneras: APIs:

Capacidades de servicio a nivel de suscripción

Para los dispositivos que ejecutan Android 15 o versiones posteriores, los operadores pueden especificar la del servicio del dispositivo a nivel de suscripción. Especificar un servicio a nivel de suscripción capacidades, usa el CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY en la API de Cloud. Por ejemplo, para especificar que una suscripción es solo de datos, establece el valor en SubscriptionManager#SERVICE_CAPABILITY_DATA

Las apps (apps de sistema precargadas y de terceros) pueden realizar consultas al proveedor. capacidades del servicio para una suscripción específica a través del SubscriptionInfo.getServiceCapabilities() . Esto permite a los desarrolladores personalizar la experiencia del usuario de las apps en función de las funciones disponibles para la suscripción. Por ejemplo, los desarrolladores de apps pueden asegúrate de que la app de Teléfono no permita realizar llamadas si el usuario está en un suscripción de solo datos.

APIs de funciones de servicio obsoletas

A partir de Android 15, Android brinda funciones de almacenamiento capacidades de servicio a nivel de suscripción. Debido a este cambio, la configuración existente se cambiaron los nombres de las APIs de capacidades para mejorar la legibilidad. En la siguiente tabla, se enumeran las APIs obsoletas y las APIs con nombre nuevo 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()