Configuração da operadora

O Android 6.0 e versões mais recentes incluem um recurso para que apps privilegiados forneçam configurações específicas da operadora para a plataforma. Essa funcionalidade, baseada nos privilégios da operadora da 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 para a plataforma por meio de uma interface definida.

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

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

A determinação de quais valores retornar depende inteiramente do app da operadora e pode ser dinâmica com base nas informações detalhadas transmitidas ao app pela plataforma.

Os principais benefícios dessa abordagem são:

  • Configuração dinâmica : suporte a conceitos como configuração não derivada de MCCMNC, por exemplo, operadoras de rede virtual móvel (MVNOs, na sigla em inglês) ou opção do cliente por serviços extras.
  • Suporte a 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 de fornecer essa configuração é concedido apenas a apps assinados pela operadora.
  • API definida : anteriormente, essa configuração era armazenada principalmente em sobreposições XML internas na estrutura 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 para um dispositivo específico é determinado consultando os 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 incluído na imagem do sistema
  3. Valores padrão, codificados na estrutura (equivalente ao comportamento anterior ao Android 6.0)

O app de configuração da plataforma

Um app de configuração de plataforma genérico é incluído na imagem do sistema. Esse app pode fornecer valores para todas as variáveis que o app de operadora normal não tem. O app de configuração da plataforma pode ser encontrado (no Android 6.0) em: packages/apps/CarrierConfig

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

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

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

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

O app da operadora recebe 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 como integrar IDs de operadora, consulte Integrar IDs de operadora com CarrierConfig.

Quando o carregamento da configuração da operadora ocorre

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 recarga
  • Quando o app da operadora é atualizado

Consulte a android.service.carrier.CarrierService#onLoadConfig() referência 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 internas de telefonia da estrutura
  • Valores de configuração retornados pelo SDK, por exemplo, no SmsManager
  • Configurações de apps, como valores de conexão 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 mudar no mesmo nível da API. Consulte a tabela abaixo para um resumo das chaves.

Criar o app

Criar o app

O app precisa segmentar o nível 23 da API 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. Adicione 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 android.service.carrier.CarrierService referência.

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 chip

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

Adicionar APNs com um app de operadora

Para adicionar APNs de maneira programática em um app de operadora (por exemplo, durante a ativação do chip), use ContentResolver APIs para adicionar itens 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 para o 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 que contenha uma assinatura de certificado válida
  • Um dispositivo com o Android 6.0 e versões mais recentes, por exemplo, um dispositivo Android

Definir recursos de serviço da operadora

No Android, os recursos de serviço da operadora descrevem se os serviços de voz, mensagens e dados são compatíveis com 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 podem ser alterados após a fabricação). As operadoras podem especificar recursos no nível do dispositivo pelas seguintes substituições de recursos do sistema:

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

Recursos de serviço no nível da assinatura

Para dispositivos com o Android 15 ou mais recente, 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 CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY API. Por exemplo, para especificar que uma assinatura é apenas 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 de serviço da operadora para uma assinatura especificada usando o SubscriptionInfo.getServiceCapabilities() método. Isso permite que os desenvolvedores de apps 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 apenas de dados.

APIs de recursos de serviço obsoletas

A partir do Android 15, o Android oferece recursos de serviço no nível do dispositivo e da assinatura. Devido a essa mudança, as APIs de recursos no nível do dispositivo foram renomeadas para melhorar a legibilidade. A tabela a seguir lista as APIs obsoletas e as APIs renomeadas introduzidas no Android 15:

Obsoletas (Android 14 ou anterior) Equivalentes (Android 15 ou mais recente)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()