如何获取所有联系人姓名,姓氏,电子邮件,电话号码等,无需重复

时间:2014-01-31 03:22:21

标签: android android-contentprovider android-contacts contactscontract

我正在尝试使用以下代码获取手机通讯录中所有可用联系人的详细信息。但面临重复值的小问题。

EDITED

实际代码开始: -

private String refreshData() {
        String emaildata = "";
        try {
            ContentResolver cr = getBaseContext().getContentResolver();
            String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP
                    + " = '" + ("1") + "'";
            String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                    + " COLLATE LOCALIZED ASC";
            Cursor cur = cr
                    .query(ContactsContract.Contacts.CONTENT_URI,
                            null,
                            selection
                                    + " AND "
                                    + ContactsContract.Contacts.HAS_PHONE_NUMBER
                                    + "=1", null, sortOrder);

            if (cur.getCount() > 0) {
                Log.i("Content provider", "Reading contact emails");
                while (cur.moveToNext()) {
                    mContactSet.add(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts._ID)));
                }
            } else {
                emaildata += "Data not found.";
            }
            cur.close();

            Log.i(TAG, "Total contacts = " + mContactSet.size());
            Iterator<String> iterator = mContactSet.iterator();

            while (iterator.hasNext()) {
                String contactId = iterator.next();
                Log.i(TAG, "ID ==> " + contactId);

                // Create query to use CommonDataKinds classes to fetch
                // emails
                Cursor emails = cr.query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                        null, ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                + " = " + contactId, null, null);

                // Name
                String whereName = ContactsContract.Data.MIMETYPE
                        + " = ? AND "
                        + ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID
                        + " = ?";
                String[] whereNameParams = new String[] {
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE,
                        contactId };
                Cursor nameCur = cr
                        .query(ContactsContract.Data.CONTENT_URI,
                                null,
                                whereName,
                                whereNameParams,
                                ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
                while (nameCur.moveToNext()) {
                    String given = nameCur
                            .getString(nameCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
                    String family = nameCur
                            .getString(nameCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
                    String display = nameCur
                            .getString(nameCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));

                    Log.i(TAG, "First Name ==> " + given);
                    Log.i(TAG, "Last Name ==> " + family);
                    Log.i(TAG, "Display ==> " + display);
                }
                nameCur.close();

            }
        } catch (Exception e) {
            emaildata += "Exception : " + e + "";
        }
        return emaildata;
    }

修改了查询并获得了一些更好的结果,但某些联系人的问题仍然存在,并且获得了重复值。

更新: - 我已经使用HashSet来获取唯一的联系人ID以及我成功获得的联系ID,但是当我从联系人ID获取名称时,我获得了相同的值2-3次联系人。我非常困惑的是,如果相同的联系人以相同的身份存储2-3次,这可能是多少?

我是否需要使用HASHSET获取姓名,姓名,电话号码,电子邮件等?还有其他方式吗?

1 个答案:

答案 0 :(得分:13)

这是完整的解决方案

public ArrayList<HashMap<String, Object>> getContacts() {

        ArrayList<HashMap<String, Object>> contacts = new ArrayList<HashMap<String, Object>>();
        final String[] projection = new String[] { RawContacts.CONTACT_ID, RawContacts.DELETED };

        @SuppressWarnings("deprecation")
        final Cursor rawContacts = managedQuery(RawContacts.CONTENT_URI, projection, null, null, null);

        final int contactIdColumnIndex = rawContacts.getColumnIndex(RawContacts.CONTACT_ID);
        final int deletedColumnIndex = rawContacts.getColumnIndex(RawContacts.DELETED);

        if (rawContacts.moveToFirst()) {
            while (!rawContacts.isAfterLast()) {
                final int contactId = rawContacts.getInt(contactIdColumnIndex);
                final boolean deleted = (rawContacts.getInt(deletedColumnIndex) == 1);

                if (!deleted) {
                    HashMap<String, Object> contactInfo = new HashMap<String, Object>() {
                        {
                            put("contactId", "");
                            put("name", "");
                            put("email", "");
                            put("address", "");
                            put("photo", "");
                            put("phone", "");
                        }
                    };
                    contactInfo.put("contactId", "" + contactId);
                    contactInfo.put("name", getName(contactId));
                    contactInfo.put("email", getEmail(contactId));
                    contactInfo.put("photo", getPhoto(contactId) != null ? getPhoto(contactId) : "");
                    contactInfo.put("address", getAddress(contactId));
                    contactInfo.put("phone", getPhoneNumber(contactId));
                    contactInfo.put("isChecked", "false");
                    contacts.add(contactInfo);
                }
                rawContacts.moveToNext();
            }
        }

        rawContacts.close();

        return contacts;
    }

    private String getName(int contactId) {
        String name = "";
        final String[] projection = new String[] { Contacts.DISPLAY_NAME };

        final Cursor contact = managedQuery(Contacts.CONTENT_URI, projection, Contacts._ID + "=?", new String[] { String.valueOf(contactId) }, null);

        if (contact.moveToFirst()) {
            name = contact.getString(contact.getColumnIndex(Contacts.DISPLAY_NAME));
            contact.close();
        }
        contact.close();
        return name;

    }

    private String getEmail(int contactId) {
        String emailStr = "";
        final String[] projection = new String[] { Email.DATA, // use
                // Email.ADDRESS
                // for API-Level
                // 11+
                Email.TYPE };

        final Cursor email = managedQuery(Email.CONTENT_URI, projection, Data.CONTACT_ID + "=?", new String[] { String.valueOf(contactId) }, null);

        if (email.moveToFirst()) {
            final int contactEmailColumnIndex = email.getColumnIndex(Email.DATA);

            while (!email.isAfterLast()) {
                emailStr = emailStr + email.getString(contactEmailColumnIndex) + ";";
                email.moveToNext();
            }
        }
        email.close();
        return emailStr;

    }

    private Bitmap getPhoto(int contactId) {
        Bitmap photo = null;
        final String[] projection = new String[] { Contacts.PHOTO_ID };

        final Cursor contact = managedQuery(Contacts.CONTENT_URI, projection, Contacts._ID + "=?", new String[] { String.valueOf(contactId) }, null);

        if (contact.moveToFirst()) {
            final String photoId = contact.getString(contact.getColumnIndex(Contacts.PHOTO_ID));
            if (photoId != null) {
                photo = getBitmap(photoId);
            } else {
                photo = null;
            }
        }
        contact.close();

        return photo;
    }

    private Bitmap getBitmap(String photoId) {
        final Cursor photo = managedQuery(Data.CONTENT_URI, new String[] { Photo.PHOTO }, Data._ID + "=?", new String[] { photoId }, null);

        final Bitmap photoBitmap;
        if (photo.moveToFirst()) {
            byte[] photoBlob = photo.getBlob(photo.getColumnIndex(Photo.PHOTO));
            photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
        } else {
            photoBitmap = null;
        }
        photo.close();
        return photoBitmap;
    }

    private String getAddress(int contactId) {
        String postalData = "";
        String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
        String[] addrWhereParams = new String[] { String.valueOf(contactId), ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE };

        Cursor addrCur = managedQuery(ContactsContract.Data.CONTENT_URI, null, addrWhere, addrWhereParams, null);

        if (addrCur.moveToFirst()) {
            postalData = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
        }
        addrCur.close();
        return postalData;
    }

    private String getPhoneNumber(int contactId) {

        String phoneNumber = "";
        final String[] projection = new String[] { Phone.NUMBER, Phone.TYPE, };
        final Cursor phone = managedQuery(Phone.CONTENT_URI, projection, Data.CONTACT_ID + "=?", new String[] { String.valueOf(contactId) }, null);

        if (phone.moveToFirst()) {
            final int contactNumberColumnIndex = phone.getColumnIndex(Phone.DATA);

            while (!phone.isAfterLast()) {
                phoneNumber = phoneNumber + phone.getString(contactNumberColumnIndex) + ";";
                phone.moveToNext();
            }

        }
        phone.close();
        return phoneNumber;
    }

如何使用?

ArrayList<HashMap<String, Object>> contactList = getContacts();
        System.out.println("Contact List : " +contactList);

<强>输出:

[
{
phone=992-561-1618;848-807-4440;, 
contactId=1, 
photo=android.graphics.Bitmap@44f40aa0, 
address=Zalavadia Strret
Manavadar, Gujarat 362630
India, 
email=birajzalavadia@gmail.com;biraj@tasolglobal.com;, 
name=Biraj Zalavadia
},
{
phone=992-511-1418;842-827-4450;, 
contactId=2, 
photo=android.graphics.Bitmap@44f40aa0, 
address=Makadiya Strret
Junagadh, Gujarat 364890
India, 
email=niles@gmail.com;niles@tasolglobal.com;, 
name=Niles patel
}
.......
]

注意:

如果有多个分号,您将收到电话和电子邮件分号(;)。