Configuração da operadora

O Android 6.0 e superior incluem a capacidade de aplicativos privilegiados fornecerem configurações específicas da operadora para a 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 afastada das sobreposições de configuração estática e dá às operadoras e OEMs a capacidade de fornecer dinamicamente a configuração da operadora à plataforma por meio de uma interface definida.

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

  • Redes 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 fica inteiramente a cargo do app da operadora e pode ser dinâmica com base em informações detalhadas repassadas ao app por meio da plataforma.

Os principais benefícios desta abordagem são:

  • Configuração dinâmica - Suporte para conceitos como configuração não derivada de MCCMNC, por exemplo, operadoras de redes virtuais móveis (MVNOs) ou clientes optando por serviços extras.
  • Suporte para dispositivos vendidos através de qualquer canal - Por exemplo, um telefone de mercado aberto pode ser configurado automaticamente com as configurações corretas baixando um aplicativo de uma loja de aplicativos.
  • Segurança - O privilégio para fornecer esta configuração é concedido apenas aos aplicativos assinados pela operadora.
  • API definida – Anteriormente, essa configuração era armazenada principalmente em sobreposições XML internas dentro da estrutura e não por meio de uma API pública. A API de configuração da operadora no Android 6.0 é pública e bem definida.

Como funciona

Carregando a configuração

A configuração da operadora fornecida por este recurso é um conjunto de pares chave-valor que alteram diversos comportamentos relacionados à telefonia na plataforma.

O conjunto de valores para um dispositivo específico é determinado consultando os seguintes componentes em ordem:

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

O aplicativo de configuração da plataforma

Um aplicativo genérico de configuração de plataforma é fornecido com a imagem do sistema. Este aplicativo pode fornecer valores para quaisquer variáveis ​​que o aplicativo de operadora regular não fornece. O aplicativo de configuração da plataforma pode ser encontrado (no Android 6.0) em: packages/apps/CarrierConfig

O objetivo deste aplicativo é fornecer alguma configuração por rede quando um aplicativo da operadora não estiver instalado, e as operadoras/OEMs devem fazer apenas alterações mínimas nele em suas próprias imagens. Em vez disso, as operadoras devem fornecer o aplicativo da operadora separado para personalização da operadora, permitindo que as atualizações sejam distribuídas por meio de lojas de aplicativos.

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

O aplicativo da operadora em questão deve ser assinado com o mesmo certificado encontrado no cartão SIM, conforme documentado em UICC Carrier Privileges .

Quais informações são passadas para o aplicativo da operadora

O aplicativo da operadora é fornecido com os seguintes valores, permitindo tomar uma decisão dinâmica sobre quais valores retornar:

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

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

Ao carregar a configuração da operadora ocorre

A construção da lista de pares de valores-chave ocorre:

  • Quando o SIM é carregado (inicialização ou hot swap do SIM)
  • Quando o aplicativo da operadora aciona manualmente uma recarga
  • Quando o aplicativo da operadora é atualizado

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

Usando a configuração

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

  • Configurações de telefonia da estrutura interna
  • Valores de configuração retornados pelo SDK, por exemplo, em SmsManager
  • Configurações do aplicativo, 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 ser alterada no mesmo nível de API. Veja a tabela abaixo para um resumo das chaves.

Construindo o aplicativo

Criando o aplicativo

Seu aplicativo deve ser direcionado ao nível da API Android 6.0 (23).

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

  1. Substitua onLoadConfig para retornar os valores que você deseja fornecer com base no objeto service.carrier.CarrierIdentifier passado.
  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 à sua conta).

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

Nomeando a classe no manifesto

Um exemplo está 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>

Assinando o aplicativo com o mesmo certificado no SIM

Consulte Privilégios de operadora UICC para obter os requisitos.

Adicionando APNs com um aplicativo de operadora

Para adicionar APNs programaticamente a partir de um aplicativo 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 obter mais informações sobre a estrutura da tabela para o URI de conteúdo, consulte Telephony.Carriers .

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

Testando o aplicativo

Depois de criar seu aplicativo de configuração, você poderá testar seu código com:

  • Um SIM contendo uma assinatura de certificado válida
  • Um dispositivo com Android 6.0 e posterior, por exemplo, um dispositivo Android