O seletor de contatos do Android oferece uma interface padrão que preserva a privacidade e permite que os usuários compartilhem contatos específicos com apps.
Introduzido no Android 17, esse recurso serve como uma alternativa sem permissão à permissão ampla READ_CONTACTS.
Ao usar o seletor de contatos, os apps podem pedir acesso a dados específicos de contatos, como números de telefone ou endereços de e-mail. O usuário seleciona os contatos que quer compartilhar, e o sistema concede ao app acesso de leitura temporário apenas a esses detalhes.
Arquitetura
O seletor de contatos consiste em dois componentes principais:
- App de interface do usuário do seletor:esse componente serve como a interface voltada ao usuário para selecionar contatos.
- Provedor de sessão:esse componente atua como o serviço de back-end que gerencia a sessão de acesso temporário.

Figura 1. Diagrama sequencial
Interface do seletor
A interface do usuário do seletor processa a interface de seleção de contatos e consulta o provedor de contatos diretamente para preencher visualizações com base nos tipos de dados solicitados. As visualizações compatíveis incluem:
- Somente números de telefone:a interface mostra contatos com números de telefone.
- Somente e-mails:a interface mostra contatos que têm endereços de e-mail.
- Dados de contato personalizados:a interface mostra contatos que correspondem a campos de dados específicos solicitados.
Além disso, a interface é compatível com os seguintes recursos:
- Lista em ordem alfabética:os contatos são classificados em ordem alfabética com remoção de duplicidade.
- Avatares de contato:a interface mostra fotos ou avatares de contatos.
- Favoritos:uma categoria "Favoritos" aparece na parte de cima da lista de contatos.
- Troca de perfil:com esse recurso, os usuários podem selecionar contatos de diferentes perfis (por exemplo, trabalho x particular).
- Seleção única e múltipla:o sistema oferece suporte aos modos de seleção única e múltipla. O limite padrão é 50 e o máximo é 100.
- Prévia da seleção:os usuários podem visualizar e gerenciar os contatos selecionados antes de confirmar.
- Rolagem rápida:esse recurso permite navegar rapidamente pela lista de contatos.
- Pesquisa:uma barra de pesquisa é fornecida para encontrar contatos específicos.
- Banner e página de detalhes de privacidade:um aviso obrigatório informa aos usuários exatamente quais campos de dados (por exemplo, números de telefone, e-mails) o app está solicitando.
Provedor de sessão
O provedor de sessão (packages/providers/ContactsProvider) atua como um intermediário seguro entre o app cliente e o provedor de contatos.
- Função:use o provedor de sessão apenas ao iniciar o seletor usando
Intent.ACTION_PICK_CONTACTS. - Gerenciamento de sessão:quando um usuário seleciona contatos, a interface do seletor grava os dados de seleção (mapeados para o UID do cliente) no provedor de sessão.
- Acesso aos dados:o provedor retorna um URI
content://com.android.providers.contacts.picker.sessionsao seletor. O seletor aplica flags de leitura adequadas antes de retornar o URI ao app cliente. Esse URI concede acesso de leitura granular e temporário aos campos de dados específicos selecionados pelo usuário, sem expor todos os dados do contato. - Acesso privilegiado:a assinatura
android.permission.MANAGE_CONTACTS_PICKER_SESSIONe as permissões privilegiadas protegem o acesso de gravação ao provedor de sessão, garantindo que apenas o seletor de sistema confiável possa criar sessões.
Integração
Os fabricantes de hardware e parceiros precisam incluir o seletor de contatos do Android em builds com Android 17 e versões mais recentes.
Intents compatíveis
Intent.ACTION_PICK_CONTACTS: a intent recomendada para apps destinados ao Android 17 e versões mais recentes.Intent.ACTION_PICK: mantido para compatibilidade com versões anteriores. O sistema encaminha automaticamente essas solicitações para o novo seletor de tipos MIME compatíveis (e-mail, telefone ou contato).
Gerenciamento de sessões
Para manter a integridade e a privacidade do dispositivo, o provedor de sessão aplica uma política estrita de limpeza de dados:
- Job de limpeza:um job do sistema (
CleanupJobService) é executado periodicamente para remover dados de sessão com mais de 24 horas. - Limite de linhas:para evitar o uso do armazenamento excessivo, a tabela do provedor de sessão tem um limite máximo de 5.000 linhas. Se a tabela atingir esse tamanho, o sistema vai remover automaticamente as linhas mais antigas antes de inserir novos dados de sessão.
- Persistência:os dados da sessão são temporários. Os apps cliente precisam persistir os dados de contato retornados imediatamente após o recebimento.
Permissões
O acesso de gravação ao provedor de sessão requer a permissão
android.permission.MANAGE_CONTACTS_PICKER_SESSION, que é
restrita ao pacote do seletor de contatos do Android.
Personalização e compliance
Os parceiros podem personalizar elementos visuais, como fontes e cores, mas as implementações precisam obedecer à seção 3.18.2 (TBD) do CDD do Android.
Validação
Os parceiros precisam verificar a implementação usando o conjunto de teste de compatibilidade (CTS) e o conjunto de teste dos Serviços do Google Mobile (GTS).