Implementando números de telefone em bloco

Como a telefonia é um canal de comunicação tão 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 textos indesejados.

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

Alguns fabricantes podem enviar 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 estejam empregando aplicativos de discagem e clientes de mensagens que forneçam essa funcionalidade, eles provavelmente ainda terão que executar a ação de bloqueio em cada aplicativo para que o bloqueio entre em vigor para chamadas e mensagens de texto.

Características

A versão Android 7.0 apresenta um provedor de conteúdo BlockedNumberProvider que armazena uma lista de números de telefone que o usuário especificou 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 as chamadas e mensagens de texto desses números. O Android 7.0 exibe 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 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égio de UICC e os aplicativos 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 aplicativos de discagem ou mensagens o usuário utilize, os números permanecem bloqueados. Por fim, a lista de números bloqueados pode 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 bloqueio e as chamadas e mensagens recebidas. Eles podem simplesmente usar o recurso fornecido pela plataforma.
  • Os aplicativos de discagem/mensageiro selecionados como padrão pelo usuário podem ler e gravar no provedor. Outros aplicativos podem iniciar a interface do usuário de gerenciamento de 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 dispositivo de outro OEM, terão uma melhor experiência de integração, pois a lista de bloqueio 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 que o usuário mantenha uma lista de bloqueio. Eles podem ter certeza de que a lista de bloqueio do usuário pode permanecer com os usuários, mesmo quando eles adquirem um novo dispositivo. Por fim, todos os aplicativos com privilégios de operadora podem ler a lista de bloqueio, portanto, se a operadora quiser fornecer algum bloqueio adicional mais poderoso para o usuário com base na lista de bloqueio, isso agora é possível com esse recurso.

Fluxo de dados

fluxo de dados de números de bloco

Figura 1. Bloquear o 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 usar o recurso de bloqueio de números:

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

Recomendações para OEMs

Se o dispositivo nunca foi enviado com nenhum recurso adicional 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 haja suporte para pontos de entrada razoáveis ​​para bloqueio, como bloquear um número diretamente do log de chamadas ou em um encadeamento de mensagens.

Se o dispositivo tiver sido enviado anteriormente 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 para esse recurso descritos no 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 restrita. 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.

API

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 interface do usuário, desde que ela 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 as imagens abaixo para a interface de números bloqueados fornecida no AOSP.

interface de usuário de números de bloco

Figura 2. Interface de usuário do bloco de números de telefone

Validação

Os implementadores podem garantir que sua versão do recurso funcione conforme o 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 depois de 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