Configuração da operadora

O Android 6.0 e versões mais recentes incluem um recurso para apps privilegiados fornecerem configuração específica da operadora à plataforma. Essa funcionalidade, baseada nos privilégios de operadora UICC introduzidos no Android 5.1 (Lollipop MR1), permite que a configuração da operadora seja removida das sobreposições de configuração estática e oferece às operadoras e OEMs a capacidade de fornecer dinamicamente a configuração da operadora à plataforma por uma interface definida.

Um app de operadora assinado corretamente pode ser pré-carregado na imagem do sistema, instalado automaticamente ou manualmente em uma app store. A plataforma consulta o app para fornecer a configuração de configurações, incluindo:

  • Redes de roaming/não roaming
  • Correio de voz visual
  • Configurações de rede de SMS/MMS
  • Configurações do VoLTE/IMS

A determinação dos valores a serem retornados é totalmente dependente do app da operadora e pode ser dinâmica com base em informações detalhadas transmitidas ao app pela plataforma.

Os principais benefícios dessa abordagem são:

  • Configuração dinâmica: oferece suporte a conceitos como configuração derivada de não MCCMNC, por exemplo, operadores de rede virtual móvel (MVNOs) ou ativar serviços extras para o cliente.
  • Suporte a dispositivos vendidos em qualquer canal: por exemplo, um smartphone de mercado aberto pode ser configurado automaticamente com as configurações corretas fazendo o download de um app de uma app store.
  • Segurança: o privilégio de fornecer essa configuração é dado apenas a apps assinados pela operadora.
  • API definida: anteriormente, essa configuração era armazenada principalmente em sobreposições XML internas no framework, e não por uma API pública. A API de configuração da operadora no Android 6.0 é pública e bem definida.

Como funciona

Carregar a configuração

A configuração da operadora fornecida por esse recurso é um conjunto de pares de chave-valor que mudam vários comportamentos relacionados à telefonia na plataforma.

O conjunto de valores de um dispositivo específico é determinado por meio de consultas aos seguintes componentes em ordem:

  1. O app da operadora (opcional, mas é o local recomendado para configurações adicionais além do que existe no Android Open Source Project (AOSP))
  2. O app de configuração da plataforma que acompanha a imagem do sistema
  3. Valores padrão, codificados no framework (equivalente ao comportamento anterior ao Android 6.0)

O app de configuração da plataforma

Um app genérico de configuração de plataforma é empacotado com a imagem do sistema. Esse app pode fornecer valores para qualquer variável que o app de operadora normal não fornece. O app de configuração da plataforma pode ser encontrado (no Android 6.0) em: packages/apps/CarrierConfig

O objetivo desse app é fornecer uma configuração por rede quando um app de operadora não estiver instalado. As operadoras/OEMs precisam fazer apenas mudanças mínimas nas próprias imagens. Em vez disso, as operadoras precisam fornecer o app separado para personalização, permitindo que as atualizações sejam distribuídas por canais como as app stores.

Como o privilégio é concedido a um app da operadora

O app da operadora em questão precisa ser assinado com o mesmo certificado encontrado no chip, conforme documentado em Privilégios da operadora do UICC.

Quais informações são transmitidas para o app da operadora

O app da operadora é fornecido com os seguintes valores, permitindo que ele tome uma decisão dinâmica sobre quais valores retornar:

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • ID da operadora

Para mais informações sobre a integração de IDs de operadora, consulte Como integrar IDs de operadora com CarrierConfig.

Ao carregar a configuração da operadora

A criação da lista de pares de chave-valor ocorre:

  • Quando o chip é carregado (inicialização ou troca a quente do chip)
  • Quando o app da operadora aciona manualmente uma atualização
  • Quando o app da operadora é atualizado

Consulte a referência android.service.carrier.CarrierService#onLoadConfig() para mais detalhes.

Usar a configuração

Quando a configuração é criada, os valores contidos nela são usados para definir vários valores de configuração do sistema, incluindo:

  • Configurações de telefonia do framework interno
  • Valores de configuração retornados pelo SDK, por exemplo, em SmsManager
  • Configurações do app, como valores de conexão de VVM no discador

Chaves de configuração

A lista de chaves é definida como parte do SDK público em android.telephony.CarrierConfigManager e não pode ser alterada no mesmo nível da API. Consulte um resumo das chaves na tabela abaixo.

Criar o app

Criar o app

O app precisa ser destinado ao nível 23 da API do Android 6.0.

Declarar uma classe que substitui android.service.carrier.CarrierService

  1. Substitua onLoadConfig para retornar os valores que você quer fornecer com base no objeto service.carrier.CarrierIdentifier transmitido.
  2. Adição de lógica para chamar notifyConfigChangedForSubId em cenários em que a configuração da operadora pode mudar ao longo do tempo (por exemplo, quando o usuário adiciona serviços extras à conta).

Confira um exemplo abaixo:

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 mais detalhes, consulte a referência android.service.carrier.CarrierService.

Nomear a classe no manifesto

Confira um exemplo abaixo:

<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>

Assinar o app com o mesmo certificado no SIM

Consulte os privilégios da operadora UICC para conferir os requisitos.

Adicionar APNs com um app da operadora

Para adicionar APNs de forma programática em um app de operadora (por exemplo, durante a ativação do SIM), use APIs ContentResolver para adicionar itens de APN a um provedor de conteúdo identificado pelo URI android.provider.Telephony.Carriers.CONTENT_URI. Para mais informações sobre a estrutura da tabela do URI de conteúdo, consulte Telephony.Carriers.

Para mais informações, consulte APN e CarrierConfig.

Testar o app

Depois de criar o app de configuração, você pode testar o código com:

  • Um chip com uma assinatura de certificado válida
  • Um dispositivo com o Android 6.0 ou versões mais recentes, por exemplo, um dispositivo Android

Definir recursos do serviço da operadora

No Android, os recursos de serviço da operadora descrevem se os serviços de voz, mensagens e dados têm suporte em um dispositivo. As operadoras podem especificar os recursos de serviço da operadora para um dispositivo no nível do dispositivo e da assinatura (Android 15 ou mais recente).

Recursos de serviço no nível do dispositivo

Os recursos de serviço no nível do dispositivo são configurados quando um dispositivo é fabricado e não podem ser alterados após a fabricação. As operadoras podem especificar recursos no nível do dispositivo com as seguintes substituições de recursos do sistema:

Os apps podem consultar os recursos de serviço no nível do dispositivo usando as seguintes APIs:

Recursos de serviço no nível da assinatura

Para dispositivos com o Android 15 ou versões mais recentes, as operadoras podem especificar os recursos de serviço do dispositivo no nível da assinatura. Para especificar os recursos de serviço no nível da assinatura, use a API CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY. Por exemplo, para especificar que uma assinatura é somente de dados, defina o valor como SubscriptionManager#SERVICE_CAPABILITY_DATA.

Os apps (apps do sistema pré-carregados e apps de terceiros) podem consultar os recursos do serviço da operadora para uma assinatura especificada pelo método SubscriptionInfo.getServiceCapabilities(). Isso permite que os desenvolvedores personalizem a experiência do usuário com base nos recursos disponíveis para a assinatura. Por exemplo, os desenvolvedores de apps podem garantir que o app de discagem não permita fazer chamadas se o usuário tiver uma assinatura somente de dados.

APIs de recursos de serviço descontinuados

A partir do Android 15, o Android oferece recursos de serviço no nível do dispositivo e da assinatura. Por causa dessa mudança, as APIs de recursos do dispositivo foram renomeadas para melhorar a legibilidade. A tabela abaixo lista as APIs descontinuadas e renomeadas introduzidas no Android 15:

Descontinuado (Android 14 ou versões anteriores) Equivalente (Android 15 ou mais recente)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()