如何一起从本地电话簿和Google联系人中获取所有联系人?

时间:2019-07-19 07:52:21

标签: android contacts android-contacts

我正在尝试从Android应用程序中的电话簿中获取联系人。但是它将获取仅存在于本地电话存储中的联系人。我需要获取所有联系人,包括使用各种帐户(例如Google)同步到设备的联系人。目前还没有发生。我正在使用RecyclerView来显示获取的联系人。

我尝试使用https://github.com/mirrajabi/rx-contacts2库进行异步获取。但这还不包括Google联系人。然后我尝试使用Android内置的CotentResolver

sheet.appendRow(1D Array);

当前,我正在尝试同步获取联系人,它使主线程挂起。如果您可以建议一些异步方法可以提供帮助。这样做时,我还需要触发器来知道任务何时完成。

1 个答案:

答案 0 :(得分:0)

您的代码应在所有同步到设备的联系人(包括Google联系人)上正常工作(假设已安装Google帐户,并且启用了联系人同步)。

但是,您的代码有一些错误,可以大大改善,目前对于具有500个联系人的设备,您正在执行约1000个查询。 您需要的所有数据都在一个名为Data的表中,因此您可以在单个快速查询中获得所有内容,请参见此处:

Map<Long, Contact> contacts = new HashMap<>();

String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1};
String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "')";
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

while (cur.moveToNext()) {
    long id = cur.getLong(0);
    String name = cur.getString(1);
    String mime = cur.getString(2); // email / phone
    String data = cur.getString(3); // the actual info, e.g. +1-212-555-1234

    // get the Contact class from the HashMap, or create a new one and add it to the Hash
    Contact contact;
    if (contacts.containsKey(id)) {
        contact = contacts.get(id);
    } else {
        contact = new Contact(id);
        contact.setDisplayName(name);
        // start with empty Sets for phones and emails
        contact.setPhoneNumbers(new HashSet<>());
        contact.setEmails(new HashSet<>());
        contacts.put(id, contact);
    } 

    switch (mime) {
        case Phone.CONTENT_ITEM_TYPE: 
            contact.getPhoneNumbers().add(data);
            break;
        case Email.CONTENT_ITEM_TYPE: 
            contact.getEmails().add(data);
            break;
    }
}
cur.close();

注意:

  1. 我已将您的listContacts更改为名为contacts的HashMap,以便我们可以快速找到现有联系人
  2. 我已将setEmailsgetPhoneNumbersgetEmails添加到您的Contact类中