我实现了一个代码来检索所有联系人,但它没有显示所有联系人,其中很少有人错过。这是我的代码:
String[] projection = new String[]{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,
};
Cursor cursor = null;
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, null, null, null);
} catch (SecurityException e) {
}
if (cursor != null) {
try {
HashSet<String> normalizedNumbersAlreadyFound = new HashSet<>();
int indexOfNormalizedNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER);
int indexOfDisplayName = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int indexOfDisplayNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
while (cursor.moveToNext()) {
String normalizedNumber = cursor.getString(indexOfNormalizedNumber);
if (normalizedNumbersAlreadyFound.add(normalizedNumber)) {
String displayName = cursor.getString(indexOfDisplayName);
String displayNumber = cursor.getString(indexOfDisplayNumber);
listOfContacts.add(new PhoneContactsModel(displayName, displayNumber, false));
} else {
}
}
Log.d("tag", "size of listOfContacts =1====" + listOfContacts.size());
} finally {
cursor.close();
}
}
不知道发生了什么。请帮我。
代码中有许多问题:
CommonDataKinds.Phone.CONTENT_URI
表,所以很自然地,您将无法获得没有电话号码的联系人(例如,姓名和电子邮件的联系人)normalizedNumbersAlreadyFound
中遇到的手机的联系人,因此如果您有两个联系人使用共享手机(如家庭电话号码),您可能会跳过其中一个。CommonDataKinds.Phone.NORMALIZED_NUMBER
may be null,在这种情况下你会跳过许多没有他们的NORMALIZED_NUMBER
字段集的联系人如果您还需要包含没有手机的联系人,我建议使用完全不同的代码。如果您只需要与手机联系,我建议不要依赖NORMALIZED_NUMBER
,而是将CommonDataKinds.Phone.CONTACT_ID
添加到您的投影中,并将其作为每个联系人的唯一密钥。