Selector de contactos en Android

Contact Picker es una característica de Android que un desarrollador puede usar para pedir a los usuarios que seleccionen un contacto en particular. Luego, el desarrollador puede consultar los detalles relacionados con el contacto seleccionado y realizar la acción requerida. A continuación se muestra un video de muestra para tener una idea de lo que vamos a hacer en este artículo. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Java .

Para que el usuario seleccione un contacto y proporcione a su aplicación acceso a toda la información de contacto, podemos usar la acción ACTION_PICK y pasar ContactsContract.Contacts.CONTENT_URI al Intent que se usará para crear la aplicación. Aquí está el constructor para Intent –

Intención (acción de string, Uri uri)

El resultado Intent se entrega a su devolución de llamada onActivityResult(int requestCode, int resultCode, Intent data) y contiene el contenido: URI que apunta al contacto seleccionado. La respuesta le otorga a su aplicación permisos temporales para leer ese contacto mediante la API del proveedor de contactos, incluso si su aplicación no incluye el permiso READ_CONTACTS . Podemos consultar el nombre para mostrar, tiene un número de teléfono, una identificación y muchos otros detalles relacionados con la tabla de  contactos de Android utilizando el URI devuelto.

Notas: 

  • El número de teléfono o la dirección de correo electrónico del contacto no se pueden obtener mediante la tabla de contactos, ya que el número de contacto no está almacenado en esta tabla.
  • Aunque la documentación establece que no requerimos el permiso READ_CONTACTS cuando usamos ACTION_PICK. Ha habido un error informado por algunos desarrolladores que afirman que en algunas versiones de Android, se requiere el permiso READ_CONTACTS cuando se usa ACTION_PICK . Verifique el problema .

Proyecto de ejemplo

Cree un nuevo proyecto en Android Studio. Seleccione Teléfono y tableta y elija Actividad vacía de las plantillas. En la siguiente pantalla, se le pedirá que proporcione detalles relacionados con su proyecto. Puede nombrar la aplicación y empaquetar lo que quiera. Aquí hemos llamado a la aplicación ContactPicker y al paquete com.geekforgeeks.android.contactpicker. Elija el idioma como Java y seleccione SDK mínimo para API 21 . Haga clic en finalizar.

Manifiesto de Android

Necesitaremos el permiso READ_CONTACTS . Necesitamos declarar este permiso en main/AndroidManifest.xml

AndroidManifest.xml

XML

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.geekforgeeks.android.contactpicker">
  
      <!-- add READ_CONTACTS permission here  -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
      
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ContactPicker">
        <activity
            android:name=".ContactPickerActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
  
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  
</manifest>

Diseño

El diseño constará de dos botones. El primer botón abrirá la aplicación de contactos y el segundo botón mostrará el nombre del contacto seleccionado. A continuación se muestra una imagen del diseño final. 

strings.xml

Antes de crear un diseño, agregue las siguientes strings en su res/values/strings.xml .

XML

<resources>
    <string name="app_name">ContactPicker</string>
      
      <!-- add the following constants -->
    <string name="contact_pick_text">Pick Contact</string>
    <string name="contact_name_text">Contact Name</string>
</resources>

actividad_contacto_recogedor.xml

Ahora elimine todos los contenidos de res/layout/activity_contact_picker.xml y agregue esto.

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ContactPickerActivity">
  
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
  
        <Button
            android:id="@+id/contact_pick"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/contact_pick_text" />
  
        <Button
            android:id="@+id/contact_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/contact_name_text" />
        
    </LinearLayout>
    
</androidx.constraintlayout.widget.ConstraintLayout>

Actividad

Primero debemos solicitar el permiso READ_CONTACTS . Agregue un método hasContactsPermission() y requestContactsPermission() en java/com/geekforgeeks/android/contactpicker/ContactPickerActivity.java. Para obtener más detalles relacionados con cómo solicitar permiso, visite aquí .

Java

public class ContactPickerActivity extends AppCompatActivity
{
    private static final int REQUEST_READ_CONTACTS_PERMISSION = 0;
   
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        ...
    }
  
    private boolean hasContactsPermission()
    {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) ==
                PackageManager.PERMISSION_GRANTED;
    }
  
    // Request contact permission if it 
    // has not been granted already
    private void requestContactsPermission()
    {
        if (!hasContactsPermission())
        {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS_PERMISSION);
        }
    }
}

En el método onCreate(Bundle SavedInstanceState) necesitamos hacer 4 cosas:

  1. Recupera ambos botones por id.
  2. Cree la intención de abrir la aplicación de contactos.
  3. Agregue un oyente al botón mPickContact que inicia la aplicación de contactos.
  4. Llame al método requestContactsPermission() .

Java

public class ContactPickerActivity extends AppCompatActivity
{
    ...
        
    private static final int REQUEST_CONTACT = 1;
  
    private Button mContactPick;
    private Button mContactName;
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_picker);
  
        // Intent to pick contacts
        final Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
  
        mContactPick = findViewById(R.id.contact_pick);
        mContactName = findViewById(R.id.contact_name);
  
        mContactPick.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                startActivityForResult(pickContact, REQUEST_CONTACT);
            }
        });
  
        requestContactsPermission();
    }
    
    ...
}

Agregue otro método updateButton (habilitación booleana) que habilitará o deshabilitará ambos botones dependiendo de si la aplicación tiene permiso de lectura de contactos o no. Esto evitará cualquier bloqueo en la aplicación.

Java

public class ContactPickerActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        ...
            
        updateButton(hasContactsPermission());
    }
  
    public void updateButton(boolean enable)
    {
        mContactPick.setEnabled(enable);
        mContactName.setEnabled(enable);
    }
  
    ...
}

Anular onRequestPermissionsResult(int requestCode, String[] permisos, int[] grantResults) que Android invocará automáticamente cuando nuestro usuario acepte o niegue el permiso de la aplicación para leer contactos. Es necesario hacerlo ya que dependiendo del resultado, debemos habilitar y deshabilitar ambos botones.

Java

public class ContactPickerActivity extends AppCompatActivity
{
    ...
  
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  
        if (requestCode == REQUEST_READ_CONTACTS_PERMISSION && grantResults.length > 0)
        {
            updateButton(grantResults[0] == PackageManager.PERMISSION_GRANTED);
        }
    }
  
    ...
}

Para el paso final, invalide onActivityResult(int requestCode, int resultCode, Intent data) que Android invocará automáticamente. Comprobamos si el método se invoca para la constante REQUEST_CONTACT que pasamos a la intención. También verificamos si los datos devueltos no están vacíos. Recuperamos los datos y consultamos los campos que queremos recuperar. El resultado se obtiene en forma de cursor. Extraemos los datos requeridos del cursor y salimos.

Java

public class ContactPickerActivity extends AppCompatActivity
{
    ...
      
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
  
        if (resultCode != Activity.RESULT_OK) return;
  
        if (requestCode == REQUEST_CONTACT && data != null)
        {
            Uri contactUri = data.getData();
  
            // Specify which fields you want 
            // your query to return values for
            String[] queryFields = new String[]{ContactsContract.Contacts.DISPLAY_NAME};
  
            // Perform your query - the contactUri
            // is like a "where" clause here
            Cursor cursor = this.getContentResolver()
                    .query(contactUri, queryFields, null, null, null);
            try
            {
                // Double-check that you 
                // actually got results
                if (cursor.getCount() == 0) return;
  
                // Pull out the first column of 
                // the first row of data 
                // that is your contact's name
                cursor.moveToFirst();
  
                String name = cursor.getString(0);
                mContactName.setText(name);
  
            }
            finally
            {
                cursor.close();
            }
        }
    }
      
    ...
}

ContactPickerActivity

Aquí está el ContactPickerActivity.java completo

Java

package com.geekforgeeks.android.contactpicker;
  
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
  
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
  
public class ContactPickerActivity extends AppCompatActivity
{
    private static final int REQUEST_READ_CONTACTS_PERMISSION = 0;
    private static final int REQUEST_CONTACT = 1;
  
    private Button mContactPick;
    private Button mContactName;
  
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  
        if (requestCode == REQUEST_READ_CONTACTS_PERMISSION && grantResults.length > 0)
        {
            updateButton(grantResults[0] == PackageManager.PERMISSION_GRANTED);
        }
    }
  
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
  
        if (resultCode != Activity.RESULT_OK) return;
  
        if (requestCode == REQUEST_CONTACT && data != null)
        {
            Uri contactUri = data.getData();
  
            // Specify which fields you want your
            // query to return values for
            String[] queryFields = new String[]{ContactsContract.Contacts.DISPLAY_NAME};
  
            // Perform your query - the contactUri 
            // is like a "where" clause here
            Cursor cursor = this.getContentResolver()
                    .query(contactUri, queryFields, null, null, null);
            try
            {
                // Double-check that you 
                // actually got results
                if (cursor.getCount() == 0) return;
  
                // Pull out the first column 
                // of the first row of data 
                // that is your contact's name
                cursor.moveToFirst();
  
                String name = cursor.getString(0);
                mContactName.setText(name);
  
            }
            finally
            {
                cursor.close();
            }
        }
    }
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_picker);
  
        // Intent to pick contacts
        final Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
  
        mContactPick = findViewById(R.id.contact_pick);
        mContactName = findViewById(R.id.contact_name);
  
        mContactPick.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                startActivityForResult(pickContact, REQUEST_CONTACT);
            }
        });
  
        requestContactsPermission();
        updateButton(hasContactsPermission());
    }
  
    public void updateButton(boolean enable)
    {
        mContactPick.setEnabled(enable);
        mContactName.setEnabled(enable);
    }
  
    private boolean hasContactsPermission()
    {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) ==
                PackageManager.PERMISSION_GRANTED;
    }
  
    // Request contact permission if it
    // has not been granted already
    private void requestContactsPermission()
    {
        if (!hasContactsPermission())
        {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS_PERMISSION);
        }
    }
}

Producción:

Publicación traducida automáticamente

Artículo escrito por anujanonymous y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *