Cómo obtener contactos de la agenda nativa en Android

Quiero mostrar todos los contactos nativos en una lista y hacer que el usuario agregue contactos de la lista (contactos múltiples) a la base de datos de mi aplicación. Cómo puedo hacerme una idea o compartir un código … gracias de antemano.

Usé este código en Android 2.1. Desconecta a cualquiera que tenga un número de teléfono (como se define en la variable de SELECCIÓN de cadena) y devuelve una Lista de tipo Persona. Persona es un objeto que tiene el nombre y el número de teléfono del usuario. Tendrá que implementar un objeto Person para usar este código, pero funciona perfectamente:

public List getContactList(){ ArrayList contactList = new ArrayList(); Uri contactUri = ContactsContract.Contacts.CONTENT_URI; String[] PROJECTION = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER, }; String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'"; Cursor contacts = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, SELECTION, null, null); if (contacts.getCount() > 0) { while(contacts.moveToNext()) { Person aContact = new Person(); int idFieldColumnIndex = 0; int nameFieldColumnIndex = 0; int numberFieldColumnIndex = 0; String contactId = contacts.getString(contacts.getColumnIndex(ContactsContract.Contacts._ID)); nameFieldColumnIndex = contacts.getColumnIndex(PhoneLookup.DISPLAY_NAME); if (nameFieldColumnIndex > -1) { aContact.setName(contacts.getString(nameFieldColumnIndex)); } PROJECTION = new String[] {Phone.NUMBER}; final Cursor phone = managedQuery(Phone.CONTENT_URI, PROJECTION, Data.CONTACT_ID + "=?", new String[]{String.valueOf(contactId)}, null); if(phone.moveToFirst()) { while(!phone.isAfterLast()) { numberFieldColumnIndex = phone.getColumnIndex(Phone.NUMBER); if (numberFieldColumnIndex > -1) { aContact.setPhoneNum(phone.getString(numberFieldColumnIndex)); phone.moveToNext(); TelephonyManager mTelephonyMgr; mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (!mTelephonyMgr.getLine1Number().contains(aContact.getPhoneNum())) { contactList.add(aContact); } } } } phone.close(); } contacts.close(); } return contactList; } 

EDITAR : Una clase de persona rudimentaria:

 public class Person { String myName = ""; String myNumber = ""; public String getName() { return myName; } public void setName(String name) { myName = name; } public String getPhoneNum() { return myNumber; } public void setPhoneNum(String number) { myNumber = number; } } 

Este código funciona perfectamente en Android 4.2. Y funciona mucho más rápido, porque no realizas consultas adicionales para cada contacto

 private static final String CONTACT_ID = ContactsContract.Contacts._ID; private static final String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; private static final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; private static final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; private static final String PHONE_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; public static ArrayList getAll(Context context) { ContentResolver cr = context.getContentResolver(); Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{PHONE_NUMBER, PHONE_CONTACT_ID}, null, null, null ); if(pCur != null){ if(pCur.getCount() > 0) { HashMap> phones = new HashMap<>(); while (pCur.moveToNext()) { Integer contactId = pCur.getInt(pCur.getColumnIndex(PHONE_CONTACT_ID)); ArrayList curPhones = new ArrayList<>(); if (phones.containsKey(contactId)) { curPhones = phones.get(contactId); } curPhones.add(pCur.getString(pCur.getColumnIndex(PHONE_CONTACT_ID))); phones.put(contactId, curPhones); } Cursor cur = cr.query( ContactsContract.Contacts.CONTENT_URI, new String[]{CONTACT_ID, DISPLAY_NAME, HAS_PHONE_NUMBER}, HAS_PHONE_NUMBER + " > 0", null, DISPLAY_NAME + " ASC"); if (cur != null) { if (cur.getCount() > 0) { ArrayList contacts = new ArrayList<>(); while (cur.moveToNext()) { int id = cur.getInt(cur.getColumnIndex(CONTACT_ID)); if(phones.containsKey(id)) { Contact con = new Contact(); con.setMyId(id); con.setName(cur.getString(cur.getColumnIndex(DISPLAY_NAME))); con.setPhone(TextUtils.join(",", phones.get(id).toArray())); contacts.add(con); } } return contacts; } cur.close(); } } pCur.close(); } return null; } 

Class Contact es similar a la clase Person de la respuesta.