【问题标题】:How to only return primary contacts like in the Android People app如何只返回 Android People 应用中的主要联系人
【发布时间】:2014-06-05 05:11:59
【问题描述】:

我正在尝试提取联系人列表并附加与给定人员关联的所有联系人。我遇到的问题是我的查询正在返回所有已通过电子邮件发送的联系人。我不想包含我通过电子邮件发送的每个联系人,但我只想要主要联系人(如内置人脉应用程序中显示的内容)。

在下面的代码中,我试图通过使用 ContactsContract.Contacts.CONTENT_URI 查询来限制返回的电子邮件,但这似乎不起作用。

任何帮助将不胜感激。

private ArrayList<ContactFriend> allContacts;
private Cursor contactsCursor;
private Cursor emailCursor;

void load() {
    getLoaderManager().initLoader(CONTACTS_LOADER_ID, null, this);
    getLoaderManager().initLoader(EMAILS_LOADER_ID, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    if (id == CONTACTS_LOADER_ID) {
        String[] projection = {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
                ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
        };
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " ASC";
        return new CursorLoader(getActivity(),
                ContactsContract.Contacts.CONTENT_URI,
                projection,
                null,
                null,
                    sortOrder);
    } else if (id == EMAILS_LOADER_ID) {
        String[] projection = {
                ContactsContract.CommonDataKinds.Email.DATA,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID
        };
        String sortOrder =
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + ", " +
                        ContactsContract.CommonDataKinds.Email.DATA + " ASC";
        return new CursorLoader(getActivity(),
                            ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                            projection,
                            null,
                            null,
                            sortOrder);
    } else {
        // should never happen
        return null;
    }
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    int id = loader.getId();
    if (id == CONTACTS_LOADER_ID) {
        contactsCursor = cursor;
    } else if (id == EMAILS_LOADER_ID) {
        emailCursor = cursor;
    }

    if (contactsCursor != null && emailCursor != null) {
        init();
    }
}

void init() {
    if (allContacts == null) {
        allContacts = getAllContacts();
    }
    // do stuff with allContacts
}

private ArrayList<ContactFriend> getAllContacts() {
    HashMap<Integer, ArrayList<String>> emails = getEmailMap();
    ArrayList<ContactFriend> result = new ArrayList<ContactFriend>();

    contactsCursor.moveToFirst();
    do {
        String name = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
        String photo = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));
        int id = contactsCursor.getInt(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
        ArrayList<String> contactEmails = emails.get(id);
        if (!contactEmails.isEmpty()) {
            result.add(new ContactFriend(name, contactEmails, photo, id));
        }
    } while (contactsCursor.moveToNext());
    return result;
}

private HashMap<Integer, ArrayList<String>> getEmailMap() {
    HashMap<Integer, ArrayList<String>> result = new HashMap<Integer, ArrayList<String>>();

    while (contactsCursor.moveToNext()) {
        int id = contactsCursor.getInt(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
        result.put(id, new ArrayList<String>());
    }

    Set<Integer> contactIds = result.keySet();
    while (emailCursor.moveToNext()) {
        int id = emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
        if (contactIds.contains(id)) {
            String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            result.get(id).add(email);
        }
    }
    return result;
}

【问题讨论】:

    标签: android contacts


    【解决方案1】:

    添加这个以防其他人遇到同样的问题。将 ContactsContract.Contacts.IN_VISIBLE_GROUP 添加到投影中,然后仅选择该值等于 1 的那些条目给了我正在寻找的内容。

    【讨论】:

    • 嗨,马特,我也遇到了同样的问题,但我只使用字符串投影,而不是选择,所以你说 只选择值等于 1 的条目是什么意思?
    • @Noni 如果您想将返回的行/联系人限制为仅包含可见行,您不仅需要在投影中包含 ContactsContract.Contacts.IN_VISIBLE_GROUP ,还需要对该列进行选择,例如String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + "==1"; 在我上面的代码中,选择变量成为 CursorLoader 中的第四个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多