Android Contacts Provider erhalten nur Telefonkontakte mit allen E-Mails

Ich muss alle Telefonkontakte sowie deren E-Mail-Adresse und Foto-URL erhalten:

Das mache ich:

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

Mein Problem ist, alle Kontakte einschließlich Google Mail-Kontakte zu erhalten, ich möchte nicht, dass Google Mail-Kontakte enthalten sind. Und die benötigte Zeit ist auch sehr langsam. Wie kann ich das optimieren? Ich weiß, dass es Zeit braucht, weil ich viele Cursor benutze. Aber ich weiß nicht, wie ich einen einzelnen Cusror machen kann, der mir den Namen der E-Mail-Nummer geben kann.

AKTUALISIERTES 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;
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage