Android obtiene un cursor solo con contactos que tienen un correo electrónico listado> android 2.0

tengo el siguiente código para obtener contactos del content provider

 String[] columns = new String[] { ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts._ID, ContactsContract.Contacts.PHOTO_ID }; Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, columns, null, null, null); 

y uso este para obtener los correos electrónicos de un contacto específico por su id:

 Cursor emails = getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contact.getContactId(), null, null); 

mi implementación actual pasa cada fila en el cursor y adquiere sus correos electrónicos y los almacena en una matriz de objetos java.

lo que me preguntaba si era posible hacerlo es consultar al proveedor de contenido y devolver un cursor de solo contactos con identificadores / nombre, etc. que tengan una dirección de correo electrónico en la lista.

de esta manera tiene un largo período de espera para obtener la lista de contactos. Estoy usando esta lista para un adaptador de lista. si puedo obtener solo los contactos que tienen un correo electrónico, puedo usar un adaptador de cursor en mi lista.

Es algo como esto posible? ¿Cómo puedo acelerar el proceso?

@CapDroid

Se corrigió el código de trabajo de la publicación de DArkO:

  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); 

Su cursor tendrá identificaciones esenciales, así como nombres y direcciones de correo electrónico. El rendimiento de este código es excelente porque solo solicita pocas columnas.

Resolví este, así es como se hace:

ACTUALIZAR

  String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID, 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 + " COLLATE NOCASE"; String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA; return mContent.query(Email.CONTENT_URI, PROJECTION, filter, null, order);