Получать уникальные и уникальные контакты с телефона, избегая двуличия
Я хочу получить список контактов с телефона, избегая дубликатов. Я думаю, что это получение контактов из учетной записи Google, телефона или сима. так как избежать дублирования контактов. хотя контакт может иметь тот же номер, но с разными номерами. но то же имя и номер не должны появляться в списке. это код
ContentResolver cr = getContentResolver();
final String[] PROJECTION = new String[] {
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
+ ("1") + "'";
//String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, selection
+ " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER
+ "=1", null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
if(cur != null) {
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String contactPhone = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String contactName = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String contactId = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
contacts.add(new Contact().setId(contactId).setName(contactName).setNumber(contactPhone));
}
}
cur.close();
}
2 ответа
Я не уверен, надежно это или нет, но у меня это сработало
Сначала скопируйте контакты в ArrayMap
с номерами телефонов в качестве ключа и именем контакта в качестве значения. В этом методе, даже если телефонные номера повторяются, он просто обновит имя.
После создания ArrayMap вы можете использовать итератор для получения контакта с уникальным номером телефона.
ArrayMap<String, String> arrayMap = new ArrayMap<>();
//
//
while (cursor.moveToNext()){
String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
arrayMap.put(phone, name);
}
//
//
for(String key: arrayMap.keySet()){
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("name", arrayMap.get(key));
jsonObject.put("phone_number", key);
contactsList.put(jsonObject);
}catch(JSONException e){
e.printStackTrace();
}
}
в вашем случае вы можете напрямую позвонить new Contacts(...)
вместо использования JSONObject.
Уникальное извлечение контактов и быстрая загрузка данных, это решение лучше
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
String[] projection = new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY,
ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.Contacts.LOOKUP_KEY
};
void getAllContacts() {
Cursor crContacts = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, selection, null, order);
String temp_name="";
while (crContacts.moveToNext()) {
FetchFamilymember temp = new FetchFamilymember();
String name = crContacts.getString(crContacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phone = crContacts.getString(crContacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String photoUri = crContacts.getString(crContacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (name.equals(temp_name))
continue;
temp_name=name;
temp.setName(name);
temp.setPhone(phone);
temp.setIsselect(false);
familylist.add(temp);
Log.d("readContacts: " , name + " Contactnumber" + phone);
}
crContacts.close();
}