这里似乎没有人回答你的问题。
你看到重复联系人的原因是你在查询电话而不是联系人。
在Android中,有三个主要的表:
Contacts
表 - 每个联系人有一项
RawContacts
表 - 每个帐户每个联系人有一项(如Google、Outlook、Whatsapp等)- 多个 RawContacts
链接到单个 Contact
Data
表 - 每个详细信息有一项(姓名、电子邮件、电话、地址等)- 每个数据项链接到一个 RawContact
,多个 Data
行链接到每个 RawContact
。
你正在查询 CommonDataKinds.Phone.CONTENT_URI
,它是 Data
表的一部分,所以如果一个联系人有多个电话和/或来自多个来源(例如 Google 和 Whatsapp)的相同电话,则你将会获得相同的电话与相同的 CONTACT_ID
多次。
解决方案是使用一个 HashMap
(而不是 HashSet
),其中键是 CONTACT_ID
,这样你就可以显示每个联系人的多个电话:
String[] projection = new String[] { CommonDataKinds.Phone.CONTACT_ID, CommonDataKinds.Phone.DISPLAY_NAME, CommonDataKinds.Phone.NUMBER };
Cursor cursor = getContentResolver().query(CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
HashMap<Long, Contact> contacts = new HashMap<>();
while (cursor.moveToNext()) {
long id = cursor.getLong(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
Contact c = contacts.get(id);
if (c == null) {
c = new Contact();
c.name = name;
contacts.put(id, c);
}
c.phones.add(phone);
}
cursor.close();
private class Contact {
public String name;
public List<String> phones = new ArrayList<>();
}
如果你想按名称对HashMap进行排序:
List<Contact> values = new ArrayList<>(contacts.values());
Collections.sort(values, new Comparator<Contact> {
public int compare(Contact a, Contact b) {
return a.name.compareTo(b.name);
}
});
for (Contact contact : values) {
Log.i(TAG, "contact " + contact.name + ": ");
for (String phone : contact.phones) {
Log.i(TAG, "\t phone: " + phone);
}
}
HASHSET
。 - IntelliJ Amiya