title: Android Contacts provider get only phone contacts with all emails
body: <p>I need to get all phone contacts and their email address and photo uri:</p>
  
  <p>This is what am doing:</p>
  
  <pre><code>private void getContacts() {
  
          ContentResolver cr = getContentResolver();
          Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME);
  
          if (cur.getCount() &gt; 0) {
              while (cur.moveToNext()) {
  
                  // if
                  // (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
                  // &gt; 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;
      }
  </code></pre>
  
  <p>My problem am getting all contacts including gmail contacts, i dont want gmail contacts to be included. And the time taken is also very slow. How do i optimize this, I know its taking time coz i am using many cursors.. but dont know how to make a single cusror that can give me name email number photo uri ...Thanks!</p>
  
  <p>UPDATED FINAL:</p>
  
  <pre><code>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() &gt; 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 &amp;&amp; _contact.getContactNumber() == null
                  &amp;&amp; _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;
  }
  </code></pre>