Android只使用列有电子邮件> android 2.0的联系人获取游标

DAr*_*rkO 15 android cursor contacts

我有以下代码来获取联系人 content provider

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);
Run Code Online (Sandbox Code Playgroud)

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

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

我当前的实现传递了游标中的每一行并获取其电子邮件并将它们存储在java对象的arrayList中.

我想知道是否有可能做的只是查询内容提供商并返回一个只有联系人的光标,其中包含列出了电子邮件地址的ids/name等.

这种方式有很长的等待时间来获取联系人列表.我正在使用此列表作为列表适配器.如果我只能得到有电子邮件的联系人我可以在我的列表中使用游标适配器.

这样的事情可能吗?我怎样才能加快这个过程?

Mar*_*cin 17

@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);
Run Code Online (Sandbox Code Playgroud)

您的光标将包含基本ID以及名称和电子邮件地址.此代码的性能很好,因为它只需要几列.

  • 为了使我的LG G3工作,我不得不将过滤器修改为"<>''"而不是"不喜欢"' (4认同)

DAr*_*rkO 10

我解决了这个,这是它的完成方式:

UPDATE

   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);
Run Code Online (Sandbox Code Playgroud)