Implementando números de telefone bloqueados

Como a telefonia é um canal de comunicação muito aberto - qualquer pessoa pode ligar ou enviar mensagens de texto para qualquer número a qualquer momento - os usuários do Android precisam bloquear facilmente chamadas e mensagens de texto indesejadas.

Antes do N, os usuários do Android dependiam de aplicativos baixados para restringir chamadas e mensagens de texto de números de telefone incômodos. Muitos desses aplicativos não funcionam conforme desejado ou fornecem uma experiência abaixo do ideal porque não existem APIs adequadas para bloquear chamadas e mensagens.

Alguns fabricantes podem fornecer suas próprias soluções de bloqueio prontas para uso, mas se os usuários trocarem de dispositivo, eles poderão perder completamente a lista de bloqueados devido à falta de interoperabilidade. Por fim, mesmo que os usuários utilizem aplicativos de discagem e clientes de mensagens que fornecem essa funcionalidade, eles provavelmente ainda terão que executar a ação de bloqueio em cada aplicativo para que o bloqueio tenha efeito tanto para chamadas quanto para mensagens de texto.

Características

A versão Android 7.0 introduz um provedor de conteúdo BlockedNumberProvider que armazena uma lista de números de telefone que o usuário especificou e não deve poder contatá-los por meio de comunicações telefônicas (chamadas, SMS, MMS). O sistema respeitará os números da lista de bloqueados, restringindo chamadas e mensagens de texto desses números. O Android 7.0 exibe a lista de números bloqueados e permite ao usuário adicionar e remover números.

Além disso, o recurso de bloqueio de números permite que o sistema e os aplicativos 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 aplicativo com privilégios UICC e os aplicativos com a mesma assinatura do sistema podem ler e gravar diretamente na lista de bloqueados. Como os números bloqueados são armazenados no sistema, independentemente dos aplicativos de discagem ou mensagens que o usuário utiliza, os números permanecem bloqueados. Por fim, a lista de números bloqueados poderá ser restaurada em qualquer novo dispositivo, independentemente do fabricante.

  • O usuário terá a garantia de ter um recurso de bloqueio que funciona imediatamente e não perderá sua lista de bloqueio quando trocar de aplicativo ou adquirir um novo telefone. Todos os aplicativos relevantes no sistema podem compartilhar a mesma lista para fornecer ao usuário a experiência mais simplificada.
  • Os desenvolvedores de aplicativos não precisam desenvolver sua própria maneira de gerenciar uma lista de bloqueios e as chamadas e mensagens recebidas. Eles podem simplesmente usar o recurso fornecido pela plataforma.
  • Os aplicativos discadores/mensageiros selecionados como padrão pelo usuário podem ler e gravar no provedor. Outros aplicativos podem iniciar a interface de usuário de gerenciamento de lista de bloqueios 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 dispositivo de outro OEM, eles terão uma experiência de integração melhor, porque a lista de bloqueios também será transferida.
  • Se a operadora tiver seu próprio discador ou aplicativo de mensagens, ela poderá reutilizar o recurso da plataforma para permitir ao usuário manter uma lista de bloqueios. Eles podem ter certeza de que a lista de bloqueios do usuário permanecerá com os usuários, mesmo quando eles adquirirem um novo dispositivo. Finalmente, todos os aplicativos com privilégios de operadora podem ler a lista de bloqueios, portanto, se a operadora quiser fornecer algum bloqueio adicional mais poderoso para o usuário com base na lista de bloqueios, isso agora é possível com esse recurso.

Fluxo de dados

fluxo de dados de números de bloco

Figura 1. Bloquear fluxo de dados de números de telefone

Exemplos e fonte

Aqui estão exemplos de chamadas usando o novo recurso de bloqueio de números:

Inicie o gerenciador de números bloqueados do aplicativo

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 devem ser concluídas para colocar o recurso de bloqueio de números em uso:

  • OEMs implementam recursos de restrição de chamadas/mensagens em seus dispositivos usando BlockedNumberProvider
  • Se a operadora tiver um aplicativo discador ou mensageiro, implemente recursos de restrição de chamadas/mensagens usando BlockedNumberProvider
  • Fornecedores terceirizados de discadores e aplicativos de mensagens usam BlockedNumberProvider para seus recursos de bloqueio

Recomendações para OEMs

Se o dispositivo nunca foi fornecido com recursos adicionais de restrição de chamadas/mensagens, use o recurso de bloqueio de número no Android Open Source Project (AOSP) em todos esses dispositivos. Recomenda-se que sejam suportados pontos de entrada razoáveis ​​para bloqueio, como bloquear um número diretamente do registro de chamadas ou dentro de um encadeamento de mensagens.

Se o dispositivo já tiver sido fornecido com recursos de restrição de chamadas/mensagens, adapte os recursos para que todos os números de telefone de correspondência estrita bloqueados sejam armazenados no BlockedNumberProvider, e que o comportamento em torno do provedor atenda aos requisitos desse recurso descritos na seção Compatibilidade do Android Documento de Definição (CDD).

Qualquer outro recurso avançado pode ser implementado por meio de provedores personalizados e UI/controles personalizados, desde que os requisitos de CDD sejam atendidos em relação ao bloqueio de números de telefone de correspondência estrita. Recomenda-se que esses outros recursos sejam rotulados como recursos “avançados” para evitar confusão com o recurso básico de bloqueio de números.

APIs

Aqui estã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)

Interface de 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 sua própria versão da UI, desde que satisfaça os requisitos de CDD relacionados.

Observe que o aplicativo de PC do parceiro para backup e restauração pode ser necessário para implementar a restauração da lista de bloqueios usando BlockedNumberProvider . Veja nas imagens abaixo a interface de números bloqueados fornecida no AOSP.

interface de usuário de números de bloco

Figura 2. Interface de usuário para bloquear números de telefone

Validação

Os implementadores podem garantir que sua versão do recurso funcione conforme esperado executando os seguintes testes 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 executar $ adb root . Por 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