🚀 5.2 Acesse os contatos do telefone

O Android disponibiliza um ContentProvider completo para compartilhar dados de contatos. No entanto, por envolverem dados sensíveis, o acesso exige permissões explícitas do usuário em tempo de execução.

Permissões e Segurança (API 23+)

No Android moderno, declarar a permissão no AndroidManifest.xml é apenas o primeiro passo:

<uses-permission android:name="android.permission.READ_CONTACTS" />

Solicitando Permissão via ActivityResultLauncher

A forma recomendada (Premium) de solicitar permissões no Android Studio 2023.1 é através do ActivityResultLauncher. Isso evita o uso dos métodos depreciados onRequestPermissionsResult.

// Na Activity (Java 17)
private final var requestPermissionLauncher = 
    registerForActivityResult(new RequestPermission(), isGranted -> {
        if (isGranted) {
            consultarContatos();
        } else {
            Toast.makeText(this, "Permissão negada", Toast.LENGTH_SHORT).show();
        }
    });
 
private void verificarPermissao() {
    if (ContextCompat.checkSelfPermission(this, READ_CONTACTS) == GRANTED) {
        consultarContatos();
    } else {
        requestPermissionLauncher.launch(READ_CONTACTS);
    }
}

Executando a Consulta com ContentResolver

Uma vez obtida a permissão, utilizamos o ContentResolver para buscar os nomes dos contatos:

private void consultarContatos() {
    var uri = ContactsContract.Contacts.CONTENT_URI;
    var projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
 
    // Executando a query através do ContentResolver
    var cursor = getContentResolver().query(uri, projection, null, null, null);
 
    if (cursor != null && cursor.moveToFirst()) {
        do {
            var nome = cursor.getString(0);
            Log.d("BOAVIAGEM", "Contato: " + nome);
        } while (cursor.moveToNext());
        cursor.close();
    }
}

IMPORTANT

Projeções Eficientes: Sempre especifique as colunas desejadas no parâmetro projection. Solicitar todas as colunas (null) é ineficiente e consome memória desnecessária do dispositivo.

TIP

Para buscas parciais, utilize a URI de filtro: Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(nomePesquisa)) Isso processa a busca de forma otimizada dentro do provedor de contatos do sistema.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️