Obtener solo la dirección de correo electrónico de la lista de contactos de Android

Quiero mostrar sólo los nombres de contacto cuya dirección de correo electrónico está presente. De lo contrario, el nombre del contacto no se mostrará en la lista. ¿Cómo puedo hacer esto? ¿Alguien puede ayudarme por favor?

public ArrayList<String> getNameEmailDetails(){ ArrayList<String> names = new ArrayList<String>(); ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); Cursor cur1 = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); while (cur1.moveToNext()) { //to get the contact names String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); Log.e("Name :", name); String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); Log.e("Email", email); if(email!=null){ names.add(name); } } cur1.close(); } } return names; } 

El método anterior devuelve un arraylist de nombres que tiene ID de correo electrónico.

Aquí está mi pregunta súper rápida para extraer direcciones de correo electrónico. Es mucho más rápido que tirar de todas las columnas de contacto como sugieren otras respuestas …

 public ArrayList<String> getNameEmailDetails() { ArrayList<String> emlRecs = new ArrayList<String>(); HashSet<String> emlRecsHS = new HashSet<String>(); Context context = getActivity(); ContentResolver cr = context.getContentResolver(); String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID, ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; String order = "CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " + ContactsContract.Contacts.DISPLAY_NAME + ", " + ContactsContract.CommonDataKinds.Email.DATA + " COLLATE NOCASE"; String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''"; Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order); if (cur.moveToFirst()) { do { // names comes in hand sometimes String name = cur.getString(1); String emlAddr = cur.getString(3); // keep unique only if (emlRecsHS.add(emlAddr.toLowerCase())) { emlRecs.add(emlAddr); } } while (cur.moveToNext()); } cur.close(); return emlRecs; } 

He probado el código proporcionado por 'Agarwal Shankar', pero tomó unos 4 segundos para obtener contactos en mi dispositivo de prueba, y este código tomó alrededor de 0,04 segundos. Este código más rápido que incorporé en la aplicación de SaluSafe . Descargar SaluSafe de google play .

Otra solución.

 private static final Uri URI_CONTACT_DATA = ContactsContract.Data.CONTENT_URI; private static final String COLUMN_EMAIL = ContactsContract.CommonDataKinds.Email.ADDRESS; private static final String COLUMN_DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY; private static final String COLUMN_MIMETYPE = ContactsContract.Data.MIMETYPE; private static final String[] PROJECTION = { COLUMN_DISPLAY_NAME, COLUMN_EMAIL, COLUMN_MIMETYPE }; private Cursor getCursor() { ContentResolver resolver = context.getContentResolver(); String selection = COLUMN_MIMETYPE + "=?"; final String[] selectionArgs = {ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}; return resolver.query(URI_CONTACT_DATA, PROJECTION, selection, selectionArgs, null); } 

El problema es que la tabla ContactsContract.Contacts.CONTENT_URI contiene toda la base de datos de contactos . Esto incluye números de teléfono, correos electrónicos, organizaciones e incluso datos totalmente personalizados, por lo que no puede utilizarlo sin filtrar con ContactsContract.Data.MIMETYPE . Una fila en esta base de datos contiene un valor (o valores, tiene 15 columnas genéricas) relacionadas con una determinada cuenta, por lo que es posible que deba agruparlas usted mismo. Necesitaba esto para autocompletar correos electrónicos, por lo que el formato (correo electrónico por fila) era perfecto.

 if (cur.getCount() > 0) { while (cur.moveToNext()) { String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Cursor emailCur = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id},null); while (emailCur.moveToNext()) { String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); Log.e("Email",name+" "+email); } emailCur.close(); } } 

Si ya puede obtener los contactos y su dirección de correo electrónico (si existe), ¿por qué no acaba de eliminar los contactos sin dirección de correo electrónico de su lista?

Consulte aquí para obtener más información sobre la API de contactos de Android.

Aquí está una manera simple de conseguir la identificación del email del contacto de la lista del contacto. Necesita pasar el identificador de contacto del usuario en el siguiente método y le devolverá el ID de correo electrónico si existe

  public String getEmail(String contactId) { String emailStr = ""; final String[] projection = new String[]{ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Email.TYPE}; Cursor emailq = managedQuery(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection, ContactsContract.Data.CONTACT_ID + "=?", new String[]{contactId}, null); if (emailq.moveToFirst()) { final int contactEmailColumnIndex = emailq.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); while (!emailq.isAfterLast()) { emailStr = emailStr + emailq.getString(contactEmailColumnIndex) + ";"; emailq.moveToNext(); } } return emailStr; } 

Y también si quieres saber cómo obtener la lista de contactos en tu aplicación, sigue este enlace: mostrar la lista de contactos en la aplicación android – trinitytuts

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.