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:
- O aplicativo da operadora (opcional, mas é o local recomendado para configurações adicionais além do que existe no Android Open Source Project (AOSP))
- O aplicativo de configuração da plataforma fornecido com a imagem do sistema
- 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
- Substitua
onLoadConfig
para retornar os valores que você deseja fornecer com base no objetoservice.carrier.CarrierIdentifier
passado. - 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