O Android 6.0 e versões mais recentes incluem um recurso para que apps privilegiados forneçam uma configuração específica 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 movida 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 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ção de configurações incluindo:
- Redes em roaming/não em roaming
- Correio de voz visual
- Configurações de rede de SMS/MMS
- Configurações de VoLTE/IMS
A determinação de quais valores retornar fica totalmente a cargo 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, operadores de rede virtual móvel (MVNOs) ou ativação de serviços extras pelo cliente.
- Suporte para dispositivos vendidos em qualquer canal: por exemplo, um smartphone de mercado aberto pode ser configurado automaticamente com as configurações corretas ao baixar um app de uma app store.
- Segurança: o privilégio de fornecer essa configuração é concedido apenas a apps assinados pela operadora.
- API definida: antes, 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 para um dispositivo específico é determinado consultando os seguintes componentes em ordem:
- O app da operadora (opcional, mas é o local recomendado para configurações adicionais além do que existe no Android Open Source Project (AOSP)).
- O app de configuração da plataforma incluído no pacote da imagem do sistema
- 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érico é agrupado com a imagem do sistema. Esse app pode fornecer valores para variáveis que o app da operadora comum não fornece. O app de configuração da plataforma
pode ser encontrado (no Android 6.0) em: packages/apps/CarrierConfig
O objetivo desse app é fornecer alguma configuração por rede quando um app de operadora não está instalado, e as operadoras/OEMs precisam fazer apenas mudanças mínimas nele nas próprias imagens. Em vez disso, as operadoras precisam fornecer um app separado para personalização, permitindo que as atualizações sejam distribuídas por canais como as app stores.
Como o privilégio é concedido a um app da operadora
O app da 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 transportadora 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 uma atualização manual
- 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 internas de telefonia da estrutura
- Valores de configuração retornados pelo SDK, por exemplo, em SmsManager
- Configurações do app, como valores de conexão do 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 de API. Confira um resumo das chaves na tabela abaixo.
Criar o app
Criar o app
O app precisa segmentar o nível 23 da API do Android 6.0.
Declare uma classe que substitua android.service.carrier.CarrierService
- Substitua
onLoadConfig
para retornar os valores que você quer fornecer com base no objetoservice.carrier.CarrierIdentifier
transmitido. - Adicione lógica para chamar
notifyConfigChangedForSubId
em cenários em que a configuração da operadora pode mudar com o 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
referência android.service.carrier.CarrierService
.
Nomeie 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 SIM
Consulte os requisitos em Privilégios da operadora UICC.
Adicionar APNs com um app da operadora
Para adicionar APNs de maneira programática em um app de operadora (por exemplo, durante a ativação do SIM), use as
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 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 SIM com uma assinatura de certificado válida
- Um dispositivo com Android 6.0 ou mais recente, por exemplo, um smartphone Android
Definir recursos de serviço da operadora
No Android, os recursos do 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 do serviço no nível do dispositivo e da assinatura (Android 15 ou mais recente).
Recursos de serviço no nível do dispositivo
As funcionalidades de serviço no nível do dispositivo são configuradas quando um dispositivo é fabricado e não podem ser alteradas depois. As operadoras podem especificar recursos no nível do dispositivo usando 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
Em 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 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 é apenas de dados, defina o valor como
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Os apps (pré-carregados do sistema e de terceiros) podem consultar os recursos do serviço
da operadora para uma assinatura específica usando o método
SubscriptionInfo.getServiceCapabilities()
. 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 discador não permita fazer ligações se o usuário tiver uma
assinatura somente de dados.
APIs de recursos de serviço descontinuadas
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 descontinuadas e as APIs 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() |