Configuração da operadora

O Android 6.0 e versões mais recentes incluem um recurso para que apps privilegiados ofereçam configuração específica da operadora para a plataforma. Essa funcionalidade, baseada nos privilégios da 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áticas e permite que operadoras e OEMs forneçam dinamicamente a configuração da operadora para a plataforma por uma interface definida.

Um app de operadora devidamente assinado pode ser pré-carregado na imagem do sistema, instalado automaticamente ou instalado manualmente por uma app store. O app é consultado pela plataforma para definir configurações, incluindo:

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

A determinação de quais valores retornar depende inteiramente 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 para dispositivos vendidos por qualquer canal: por exemplo, um smartphone de mercado aberto pode ser configurado automaticamente com as configurações corretas fazendo o download de um app em uma app store.
  • Segurança: o privilégio para fornecer essa configuração é concedido apenas aos 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, que é opcional, mas é o local recomendado para outras configurações além do que existe no Android Open Source Project (AOSP)
  2. O app de configuração da plataforma incluído na 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 de configuração de plataforma genérica é incluído com a imagem do sistema. Esse app pode fornecer valores para qualquer variável que o app da operadora normal não fornece. O app de configuração da plataforma pode ser encontrado (no Android 6.0) em: packages/apps/CarrierConfig

A finalidade desse app é fornecer algumas configurações por rede quando um app de operadora não está instalado, e as operadoras/OEMs precisam fazer apenas mudanças mínimas nas próprias imagens. Em vez disso, elas precisam fornecer o app separado da operadora para personalização, permitindo que as atualizações sejam distribuídas por meios como lojas de apps.

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

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

Quais informações são transmitidas ao 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
  • ID2
  • 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 estiver carregado (inicialização ou hot swap do chip)
  • Quando o app da operadora aciona uma atualização manualmente
  • 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, no 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

Seu app precisa ser direcionado ao nível da API do Android 6.0 (23).

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. Adicione lógica para chamar notifyConfigChangedForSubId em cenários em que a configuração da operadora possa mudar com o tempo (por exemplo, quando o usuário adiciona outros serviços à 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>

Assine o app com o mesmo certificado no chip

Consulte Privilégios de operadora do UICC para ver 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 SIM com uma assinatura de certificado válida
  • Um dispositivo com Android 6.0 e versões mais recentes, por exemplo, um dispositivo Android

Definir recursos de serviços 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 (não pode ser alterado 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 pré-carregados do sistema e de terceiros) podem consultar os recursos de serviços da operadora para uma assinatura especificada pelo método SubscriptionInfo.getServiceCapabilities(). Isso permite que os desenvolvedores personalizem a experiência do usuário nos apps 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

No Android 15 e versões mais recentes, 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 a seguir 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()