Como a telefonia é um canal de comunicação aberto, qualquer pessoa pode ligar ou enviar mensagens de texto para qualquer número a qualquer momento. Por isso, os usuários do Android precisam poder bloquear chamadas e mensagens indesejadas com facilidade.
Antes do Android 7.0, os usuários do Android precisavam usar apps transferidos para restringir ligações e mensagens de texto de números de telefone incômodos. Muitos desses apps não funcionam como desejado ou oferecem uma experiência menos ideal porque não há APIs adequadas para bloquear chamadas e mensagens.
Alguns fabricantes podem enviar as próprias soluções de bloqueio prontas para uso, mas, se os usuários mudarem de dispositivo, eles podem perder a lista de bloqueios completamente devido à falta de interoperabilidade. Por fim, mesmo que os usuários estejam usando apps de discagem e clientes de mensagens que oferecem essa funcionalidade, eles provavelmente ainda precisam realizar a ação de bloqueio em cada app para que o bloqueio entre em vigor para ligações e mensagens de texto.
Recursos
A versão do Android 7.0 apresenta um provedor de conteúdo
BlockedNumberProvider
que armazena uma lista de números de telefone especificados pelo usuário que não
podem entrar em contato com ele por meio de comunicações telefônicas (chamadas, SMS, MMS). O
sistema vai respeitar os números na lista bloqueada, restringindo as chamadas e
mensagens de texto desses números. O Android 7.0 mostra a lista de números bloqueados e
permite que o usuário adicione e remova números.
Além disso, o recurso de bloqueio de número permite que o sistema e os apps relevantes na plataforma trabalhem juntos para ajudar a proteger o usuário e simplificar a experiência. O discador padrão, o cliente de mensagens padrão, o app com privilégios de UICC e os apps com a mesma assinatura do sistema podem ler e gravar diretamente na lista bloqueada. Como os números bloqueados são armazenados no sistema, não importa quais apps de discagem ou mensagens o usuário usa, os números permanecem bloqueados. Por fim, a lista de números bloqueados pode ser restaurada em qualquer dispositivo novo, independente do fabricante.
- O usuário terá um recurso de bloqueio que funciona pronto para uso e não perderá a lista de bloqueio ao trocar de app ou comprar um novo smartphone. Todos os apps relevantes no sistema podem compartilhar a mesma lista para oferecer ao usuário a experiência mais simplificada.
- Os desenvolvedores de apps não precisam desenvolver uma maneira própria de gerenciar uma lista de bloqueio e as chamadas e mensagens recebidas. Eles podem simplesmente usar o recurso fornecido pela plataforma.
- Os apps de discador / mensageiro selecionados como padrão pelo usuário podem
ler e gravar dados no provedor. Outros apps podem iniciar a interface do usuário
de gerenciamento da lista de bloqueio usando
createManageBlockedNumbersIntent()
. - Os OEMs podem usar o recurso fornecido pela plataforma para enviar um recurso de bloqueio pronto para uso. Os OEMs podem ter certeza de que, quando os usuários mudarem de um dispositivo de outro OEM, eles terão uma experiência de integração melhor, porque a lista de bloqueio também será transferida.
- Se a operadora tiver um app de discagem ou de mensagens, ela poderá reutilizar o recurso da plataforma para permitir que o usuário mantenha uma lista de bloqueio. Eles podem ficar tranquilos porque a lista de bloqueio do usuário pode permanecer com eles, mesmo quando eles recebem um novo dispositivo. Por fim, todos os apps com privilégios da operadora podem ler a lista de bloqueio. Portanto, se a operadora quiser oferecer um bloqueio mais poderoso para o usuário com base na lista de bloqueio, isso será possível com esse recurso.
Fluxo de dados

Figura 1. Bloquear o fluxo de dados de números de telefone
Exemplos e origem
Confira exemplos de ligações que usam o novo recurso de bloqueio de números:
Iniciar o gerenciador de números bloqueados no app
Context.startActivity(telecomManager.createManageBlockedNumbersIntent(), null);
Consultar números bloqueados
Cursor c = getContentResolver().query(BlockedNumbers.CONTENT_URI, new String[]{BlockedNumbers.COLUMN_ID, BlockedNumbers.COLUMN_ORIGINAL_NUMBER, BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null);
Colocar número bloqueado
ContentValues values = new ContentValues(); values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values);
Excluir número bloqueado
ContentValues values = new ContentValues(); values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values); getContentResolver().delete(uri, null, null);
Implementação
Estas são as tarefas de alto nível que precisam ser concluídas para usar o recurso de bloqueio de números:
- Os OEMs implementam recursos de restrição de chamadas/mensagens nos dispositivos usando
BlockedNumberProvider
- Se a operadora tiver um app de discagem ou de mensagens, implemente os recursos de restrição de ligação/mensagem
usando
BlockedNumberProvider
- Fornecedores de apps de discagem e de mensagens de terceiros usam
BlockedNumberProvider
para os recursos de bloqueio
Recomendações para OEMs
Se o dispositivo nunca tiver sido enviado com outros recursos de restrição de chamadas/mensagens, use o recurso de bloqueio de número no Android Open Source Project (AOSP) em todos esses dispositivos. Recomendamos que pontos de entrada razoáveis para bloqueio sejam aceitos, como bloquear um número diretamente do registro de chamadas ou em uma linha de mensagens.
Se o dispositivo foi enviado com recursos de restrição de chamadas/mensagens,
adapte os recursos para que todos os números de telefone de correspondência estrita que são bloqueados
sejam armazenados no BlockedNumberProvider,
e que o comportamento
em torno do provedor atenda aos requisitos desse recurso descritos no
Documento de definição de compatibilidade do Android (CDD).
Qualquer outro recurso avançado pode ser implementado por provedores personalizados e controles/interfaces personalizados, desde que os requisitos de CDD sejam atendidos em relação ao bloqueio de números de telefone com correspondência estrita. Recomendamos que esses outros recursos sejam rotulados como "avançados" para evitar confusão com o recurso básico de bloqueio de números.
APIs
Estas são as APIs em uso:
TelecomManager API
Intent createManageBlockedNumbersIntent()
Carrier Config
KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT
- Consulte
BlockedNumberContract
- APIs fornecidas por
BlockedNumberContract
boolean isBlocked(Context context, String phoneNumber)
int unblock(Context context, String phoneNumber)
boolean canCurrentUserBlockNumbers(Context context)
- APIs fornecidas por
Interface do usuário
A interface do usuário BlockedNumbersActivity.java fornecida no AOSP pode ser usada como está. Os implementadores de dispositivos também podem implementar a própria versão da interface, desde que ela atenda aos requisitos de CDD relacionados.
Talvez seja necessário usar o app para PC do parceiro para backup e restauração
para implementar a restauração da lista de bloqueio usando
BlockedNumberProvider
. Confira as imagens abaixo para ver a interface de números
bloqueados fornecida no AOSP.

Figura 2. Interface do usuário para bloquear números de telefone
Validação
Os implementadores podem garantir que a versão do recurso funcione conforme o esperado executando os seguintes testes do CTS:
android.provider.cts.BlockedNumberContractTest com.android.cts.numberblocking.hostside.NumberBlockingTest android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected android.telephony.cts.SmsManagerTest#testSmsBlocking
O BlockedNumberProvider
pode ser manipulado usando comandos adb
após a execução de $ adb root
. Exemplo:
adb root
adb shell content query --uri content://com.android.blockednumber/blocked
adb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000'
adb shell content delete --uri / content://com.android.blockednumber/blocked/1