El proveedor de contactos de Android sólo obtiene contactos telefónicos con todos los correos electrónicos

Necesito obtener todos los contactos del teléfono y su dirección de correo electrónico y foto uri:

Esto es lo que estoy haciendo:

private void getContacts() { ContentResolver cr = getContentResolver(); Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME); if (cur.getCount() > 0) { while (cur.moveToNext()) { // if // (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) // > 0) { Contact contact = new Contact(); String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); Uri uri = getContactPhotoUri(Long.parseLong(id)); // set photoUri contact.setContactPhotoUri(uri); // set name contact.setContactName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); // get the phone number Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); while (pCur.moveToNext()) { // set phone munber contact.setContactNumber(pCur.getString(pCur .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); contacts.add(contact); } pCur.close(); // get email and type Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] { id }, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses // if the email addresses were stored in an array // set email contact.setContactEmail(emailCur.getString(emailCur .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); contacts.add(contact); } emailCur.close(); } } cur.close(); contactAdapter = new ContactAdapter(this, R.id.contactList, contacts); // } } public Uri getContactPhotoUri(long contactId) { Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); photoUri = Uri.withAppendedPath(photoUri, Contacts.Photo.CONTENT_DIRECTORY); return photoUri; } 

Mi problema es conseguir todos los contactos incluyendo contactos de Gmail, no quiero que los contactos de Gmail se incluyan. Y el tiempo tomado es también muy lento. ¿Cómo puedo optimizar esto, sé que está tomando tiempo porque estoy usando muchos cursores .. pero no sé cómo hacer un solo error que puede darme nombre de correo electrónico número de fotos uri … Gracias!

ACTUALIZADO FINAL:

 private void getContacts() { ContentResolver cr = getContentResolver(); Cursor cur = cr.query(Data.CONTENT_URI, new String[] { Data.CONTACT_ID, Data.MIMETYPE, Email.ADDRESS, Contacts.DISPLAY_NAME, Phone.NUMBER }, null, null, Contacts.DISPLAY_NAME); Contact contact; if (cur.getCount() > 0) { while (cur.moveToNext()) { String id = cur.getString(cur.getColumnIndex(Data.CONTACT_ID)); String mimeType = cur.getString(cur.getColumnIndex(Data.MIMETYPE)); if (allContacts.containsKey(id)) { // update contact contact = allContacts.get(id); } else { contact = new Contact(); allContacts.put(id, contact); // set photoUri contact.setContactPhotoUri(getContactPhotoUri(Long.parseLong(id))); } if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) // set name contact.setContactName(cur.getString(cur.getColumnIndex(Contacts.DISPLAY_NAME))); if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) // set phone munber contact.setContactNumber(cur.getString(cur.getColumnIndex(Phone.NUMBER))); if (mimeType.equals(Email.CONTENT_ITEM_TYPE)) // set email contact.setContactEmail(cur.getString(cur.getColumnIndex(Email.ADDRESS))); } } cur.close(); // get contacts from hashmap contacts.clear(); contacts.addAll(allContacts.values()); // remove null contacts for (Contact _contact : contacts) { if (_contact.getContactName() == null && _contact.getContactNumber() == null && _contact.getContactEmail() == null) { contacts.remove(_contact); break; } } contactAdapter = new ContactAdapter(this, R.id.contactList, contacts); contactAdapter.notifyDataSetChanged(); } public Uri getContactPhotoUri(long contactId) { Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); photoUri = Uri.withAppendedPath(photoUri, Contacts.Photo.CONTENT_DIRECTORY); return photoUri; } 

Usted debe ser capaz de obtener toda la información necesaria en una consulta en Data.CONTENT_URI, echa un vistazo a la tabla "android.provider.ContactsContract.Data" y los ejemplos sobre cómo consultar diferentes tipos de datos de correo electrónico, teléfono, foto, etc … http://developer.android.com/reference/android/provider/ContactsContract.Data.html

Por ejemplo:

 Cursor data = cntx.getContentResolver().query(Data.CONTENT_URI, new String[] {Data._ID,Data.MIMETYPE,Email.ADDRESS,Photo.PHOTO},Data.CONTACT_ID + "=?" + " AND " + "(" + Data.MIMETYPE + "='" + Photo.CONTENT_ITEM_TYPE + "' OR " + Data.MIMETYPE + "='" + Email.CONTENT_ITEM_TYPE +"')", new String[] {String.valueOf(contactId)}, null); 

Debe traerle toda la información que necesita sobre un contactId específico, teóricamente podría pedir todos los contactos y ordenar la información usted mismo.

En cuanto al filtrado de contactos de Gmail, este es un tema más complejo, eche un vistazo al parámetro ACCOUNT_NAME / TYPE http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html y una discusión sobre este problema aquí: ¿Qué Es el tipo / nombre de cuenta predeterminado para los contactos de la aplicación de contacto de Android?

  • Android - ¿Vale la pena ver ViewStub?
  • Costo de invocar un método en Android
  • Android - Prevenga la pantalla blanca al inicio
  • ListView vs LinearLayout
  • Diseño complejo de Android lineal y relativo
  • Rendimiento en tiempo real de la galería de lienzo de Android
  • Mi aplicación se redujo significativamente en Android 4.0
  • Androide. Rendimiento de la animación
  • Vista de lista dinámica - Patrón de diseño
  • Cómo ocultar la barra inferior del sistema en la tableta android
  • Enviar eficientemente int a través de sockets en Java
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.