O Android 6.0 e versões mais recentes incluem um recurso para que apps privilegiados ofereçam configuração específica da operadora para a plataforma. Essa funcionalidade, baseada nos privilégios da operadora UICC introduzidos no Android 5.1 (Lollipop MR1), permite que a configuração da operadora seja removida das sobreposições de configuração estáticas e permite que operadoras e OEMs forneçam dinamicamente a configuração da operadora para a plataforma por uma interface definida.
Um app de operadora devidamente assinado pode ser pré-carregado na imagem do sistema, instalado automaticamente ou instalado manualmente por uma app store. O app é consultado pela plataforma para definir configurações, incluindo:
- Redes de roaming/não roaming
- Correio de voz visual
- Configurações de rede de SMS/MMS
- Configurações de VoLTE/IMS
A determinação de quais valores retornar depende inteiramente do app da operadora e pode ser dinâmica com base em informações detalhadas transmitidas ao app pela plataforma.
Os principais benefícios dessa abordagem são:
- Configuração dinâmica: oferece suporte a conceitos como configuração derivada de não MCCMNC, por exemplo, operadores de rede virtual móvel (MVNOs) ou ativar serviços extras para o cliente.
- Suporte para 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 para fornecer essa configuração é concedido apenas aos apps assinados pela operadora.
- API definida: anteriormente, 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 de um dispositivo específico é determinado por meio de consultas aos seguintes componentes em ordem:
- O app da operadora, que é opcional, mas é o local recomendado para outras configurações além do que existe no Android Open Source Project (AOSP)
- O app de configuração da plataforma incluído na 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érica é incluído com a imagem do sistema. Esse app pode fornecer
valores para qualquer variável que o app da operadora normal não fornece. O app de configuração
da plataforma pode ser encontrado (no Android 6.0) em: packages/apps/CarrierConfig
A finalidade desse app é fornecer algumas configurações por rede quando um app de operadora não está instalado, e as operadoras/OEMs precisam fazer apenas mudanças mínimas nas próprias imagens. Em vez disso, elas precisam fornecer o app separado da operadora para personalização, permitindo que as atualizações sejam distribuídas por meios como lojas de apps.
Como o privilégio é concedido a um app de operadora
O app da operadora em questão precisa ser assinado com o mesmo certificado encontrado no cartão SIM, conforme documentado em Privilégios de operadora do UICC.
Quais informações são transmitidas ao app da operadora
O app da operadora é fornecido com os seguintes valores, permitindo que ele tome uma decisão dinâmica sobre quais valores retornar:
- MCC
- MNC
- SPN
- IMSI
- GID1
- ID2
- ID da operadora
Para mais informações sobre a integração de IDs de operadora, consulte Como integrar IDs de operadora com CarrierConfig.
Ao carregar a configuração da operadora,
A criação da lista de pares de chave-valor ocorre:
- Quando o chip estiver carregado (inicialização ou hot swap do chip)
- Quando o app da operadora aciona uma atualização manualmente
- 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 de telefonia do framework interno
- Valores de configuração retornados pelo SDK, por exemplo, no SmsManager
- Configurações do app, como valores de conexão de 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 da API. Consulte um resumo das chaves na tabela abaixo.
Criar o app
Criar o app
Seu app precisa ser direcionado ao nível da API do Android 6.0 (23).
Declarar uma classe que substitui 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 possa mudar com o tempo (por exemplo, quando o usuário adiciona outros serviços à 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
.
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>
Assine o app com o mesmo certificado no chip
Consulte Privilégios de operadora do UICC para ver os requisitos.
Adicionar APNs com um app da operadora
Para adicionar APNs de forma programática em um app 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 mais informações sobre a estrutura da tabela do 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 e versões mais recentes, por exemplo, um dispositivo Android
Definir recursos de serviços da operadora
No Android, os recursos de serviço da operadora descrevem se os serviços de voz, mensagens e dados têm suporte em 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 pode ser alterado após a fabricação). As operadoras podem especificar recursos no nível do dispositivo com 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
Para 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 os 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 é somente de dados, defina o valor como
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Os apps (apps pré-carregados do sistema e de terceiros) podem consultar os recursos de serviços
da operadora para uma assinatura especificada pelo
método
SubscriptionInfo.getServiceCapabilities()
. Isso permite que os desenvolvedores personalizem a experiência do usuário nos apps 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 somente de dados.
APIs de recursos de serviço descontinuados
No Android 15 e versões mais recentes, o Android oferece recursos de serviço no nível do dispositivo e da assinatura. Por causa dessa mudança, as APIs de recursos do dispositivo foram renomeadas para melhorar a legibilidade. A tabela a seguir lista as APIs descontinuadas e 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() |