Configuração da operadora

O Android 6.0 e superior incluem um recurso para aplicativos privilegiados para fornecer configuração específica 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 oferece à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 assinado corretamente 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ção para configurações, incluindo:

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

A determinação de quais valores devolver depende inteiramente do aplicativo da operadora e pode ser dinâmica com base em informações detalhadas passadas ao aplicativo por meio da plataforma.

Os principais benefícios desta abordagem são:

  • Configuração dinâmica - Suporte para conceitos como configuração derivada não MCCMNC, por exemplo, operadoras de rede virtual móvel (MVNOs) ou opt-in do cliente para serviços extras.
  • Suporte para dispositivos vendidos em 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 de fornecer essa 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 esse recurso é um conjunto de pares de valores-chave que alteram vários comportamentos relacionados à telefonia na plataforma.

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

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

O aplicativo de configuração da plataforma

Um aplicativo de configuração de plataforma genérica é empacotado com a imagem do sistema. Este aplicativo pode fornecer valores para quaisquer variáveis ​​que o aplicativo regular da operadora 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 de operadora não estiver instalado e as operadoras/OEMs devem fazer apenas alterações mínimas em suas próprias imagens. Em vez disso, as operadoras devem fornecer o aplicativo de operadora separado para personalização da operadora, permitindo que as atualizações sejam distribuídas por meios como 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 Privilégios da operadora UICC .

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

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

  • MCC
  • EMN
  • 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 chave-valor ocorre:

  • Quando o SIM é carregado (inicialização ou troca a quente 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, no 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. Consulte a tabela abaixo para obter um resumo das chaves.

Construindo o aplicativo

Criando o aplicativo

Seu aplicativo deve segmentar o nível de API do 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 da operadora UICC para obter os requisitos.

Adicionando APNs com um aplicativo de operadora

Para adicionar APNs programaticamente 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ê pode 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