仅获取已列出电子邮件的联系人光标 >Android 2.0

15

我有以下代码可以从内容提供程序中获取联系人

String[] columns = new String[] {
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.PHOTO_ID };
        Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
                columns, null, null, null);

我使用这个函数来获取特定联系人ID的电子邮件:

Cursor emails = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID
                            + " = " + contact.getContactId(), null, null);

我目前的实现方式是通过遍历游标中的每一行,获取其电子邮件并将它们存储在Java对象的ArrayList中。

我想知道是否可以仅查询内容提供程序并返回仅具有电子邮件地址列表的id / name等联系人的游标。

这种方法需要等待很长时间来获取联系人列表。我正在使用此列表用于列表适配器。如果只能获取具有电子邮件的联系人,则可以在我的列表中使用游标适配器。

是否可能像这样做?如何加快这个过程?

2个回答

18

@CapDroid

从DArkO的帖子中修复了可工作的代码:

    ContentResolver cr = context.getContentResolver();
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_ID,
            ContactsContract.CommonDataKinds.Email.DATA, 
            ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    String order = "CASE WHEN " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + ", " 
            + ContactsContract.CommonDataKinds.Email.DATA
            + " COLLATE NOCASE";
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);

您的光标将具有必要的ID,以及姓名和电子邮件地址。这段代码的性能非常好,因为它仅请求少量列。


那个“order”是干嘛用的? - gyosida
4
为了使它在我的LG G3上正常工作,我必须将过滤器修改为“<>''”,而不是“NOT LIKE ''”。 - AndreasEK

10

我解决了这个问题,下面是解决方案:

更新

   String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
        Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

    String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
        + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
        + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
    String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;

    return mContent.query(Email.CONTENT_URI,
                      PROJECTION, filter, null, order);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接