Cómo acceder a los contactos en Android

Buenas, hace poco necesité acceder a la libreta de direcciones de mi dispositivo. Seleccionar un contacto y obtener algún dato de este. Para hacerlo utilicé algunos de los elementos que nos proporciona Android y un poquito de código. Vamos a ver como se hace.



Lo primero que hay que hacer es añadir un nuevo permiso a nuestra aplicación en el archivo AndroidManifest.xml para leer contactos. Siempre que añadais un permiso en vuestras aplicaciones no está de más que expliquéis a vuestros potenciales usuarios el por que de cada uno.


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


Ahora para el proceso de acceder a la libreta de contactos y seleccionar uno vamos a crearnos una clase llamada ContactsManager.


public class ContactsManager {

 private final int CONTACT_PICKER_RESULT = 898;
 private Activity activity;
 public ContactsManager(Activity activity){
  this.activity = activity;  
 }
 
 public void selectContact(){
  Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);  
  this.activity.startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT); 
 }
 
 
 /**
  * Llamada en el ActivityResult de nuestra activity para obtener el email del usuario
  */
 public void onActivityResult(int requestCode, int resultCode, Intent data, onSelectedEmail onSelectedEmailHandler){
  if(requestCode == CONTACT_PICKER_RESULT){
  if (resultCode == Activity.RESULT_OK) {  
           
               Cursor cursor = null;  
               String email = "";  
               try {  
                   Uri result = data.getData();  
                   
                   String id = result.getLastPathSegment();  
                   
                   cursor = this.activity.getContentResolver().query(Email.CONTENT_URI, null, Email.CONTACT_ID + "=?", new String[] { id }, null);  
                   int emailIdx = cursor.getColumnIndex(Email.DATA);  
                   
                   if (cursor.moveToFirst())   
                       email = cursor.getString(emailIdx);
                      
               } catch (Exception e) {                       
               } finally {  
                   if (cursor != null)   
                       cursor.close();  
                   if (email.length() == 0)  
                    onSelectedEmailHandler.onFailure();
                    else                    
                    onSelectedEmailHandler.onSuccess(email);                   
               }  
               
       } else {              
        onSelectedEmailHandler.onFailure();
       }
  }
 }
 
 public interface onSelectedEmail{ void onSuccess(String email); void onFailure();};
 
}


Nuestra clase tiene un método llamado selectContact. Este se encargará de crear un nuevo Intent el cual va a abrir la libreta de direcciones. Llamándolo con startActivityForResult y pasándole el valor definido en CONTACT_PICKER_RESULT, al seleccionar un contacto de la agenda volveremos a nuestra Activity. En esta comprobamos que todo fue bien con un valor que nos devuelve Android, que el valor del proceso es CONTACT_PICKER_RESULT y obtenemos los datos de vuelta para trabajar el resultado final.

El método onActivityResult de nuestra clase va a recibir los parámetros del método onActivityResult de la Activity. Todo esto se puede hacer en una Activity, pero hacerlo así simplifica bastante el código en la Activity y lo podemos utilizar de una forma más cómoda en donde lo necesitemos.

En este método verificaremos que el requestCode es CONTACT_PICKER_RESULT y que el resultCode ha devuelto el valor definido para RESULT_OK.

Para evaluar el resultado, en una variable tipo Uri, le asignamos el resultado de nuestra selección data. Este nos ayudará a obtener el id del usuario, el cual mediante una consulta almacenamos en un Cursor todos los emails que pueda tener el usuario.


Finalmente, avanzamos a la primera posición del Cursor y obtenemos el primer email (en caso de que tenga algún email).


En función del resultado de todo el proceso, vamos llamando al método correspondiente de nuestro listener también creado en esta clase y que más adelante utilizaremos para saber si el proceso ha finalizado bien o con algún error.


En la Activity que utilicéis esta clase podéis obtar por utilizar un botón o cualquier otro método que mediante un click o otra acción abra la libreta. De momento declaramos una variable para nuestra clase en el ambito de la Activity.


private ContactsManager contacts;


Ahora en el onCreate, o donde vosotros declareis los objetos de vuestra Activity, debemos inicializar, contacts. Además os pongo un ejemplo de como abrir la lista de contactos. lo pongo muy simplificado, pero os debéis asegurar de declarar el botón o lo que utiliceis.


@Override
    public void onCreate(Bundle savedInstanceState)  {

contacts = new ContactsManager(this);

//Este es un botón que debeis declarar, puede ser cualquier otro elemento que vosotros querais.
btn.setOnClickListener(new OnClickListener() {   
   @Override
   public void onClick(View v) {
    contacts.selectContact();
   }
  });
}



Siguiendo en nuestra Activity, vamos a utilizar el método onActivityResult, como os decía, este método se utiliza para obtener información de otras Activitys que son llamadas en la Activity en la que estamos y que volveremos a ella para completar un proceso, por ejemplo, seleccionar un contacto, o hacer una foto para trabajar con ella, entre otras cosas.


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       contacts.onActivityResult(requestCode, resultCode, data, new onSelectedEmail() {   
   @Override
   public void onSuccess(String email) {
    //Sustituid HolaMundoActivity por el nombre de vuestra Activity
    Toast.makeText(HolaMundoActivity.this, "email " + email, Toast.LENGTH_SHORT).show();
   }
   
   @Override
   public void onFailure() {    
    //Implementar el proceso correspondiente en caso de fallo
   }
  });
   }


Como veis el código es muy sencillo, simplemente le pasamos los parámetros de nuestra ActivityResult a nuestra clase de contactos y creamos una instancia del listener que hará un proceso en caso de que todo haya ido correcto u otro en caso de encontrar algún error.

Comments are closed.