我正在尝试从Android应用程序中的电话簿中获取联系人。但是它将获取仅存在于本地电话存储中的联系人。我需要获取所有联系人,包括使用各种帐户(例如Google)同步到设备的联系人。目前还没有发生。我正在使用RecyclerView来显示获取的联系人。
我尝试使用https://github.com/mirrajabi/rx-contacts2库进行异步获取。但这还不包括Google联系人。然后我尝试使用Android内置的CotentResolver
sheet.appendRow(1D Array);
当前,我正在尝试同步获取联系人,它使主线程挂起。如果您可以建议一些异步方法可以提供帮助。这样做时,我还需要触发器来知道任务何时完成。
答案 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();
注意:
listContacts
更改为名为contacts
的HashMap,以便我们可以快速找到现有联系人setEmails
,getPhoneNumbers
和getEmails
添加到您的Contact
类中