在Android上删除重复联系人的一种解决方法是使用ContentResolver来查询并删除重复的联系人。下面是一个示例代码:
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
public class ContactDuplicateRemover {
public static void removeDuplicateContacts(ContentResolver contentResolver) {
// 查询联系人数据
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
// 创建一个存储已处理联系人的ID的HashSet
HashSet contactsIds = new HashSet<>();
if(cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
long contactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
// 如果该联系人已经处理过,则跳过
if (contactsIds.contains(contactId)) {
continue;
}
// 查询该联系人的所有电话号码
Cursor phoneCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{String.valueOf(contactId)},
null);
// 创建一个存储该联系人的所有电话号码的HashSet
HashSet phoneNumbers = new HashSet<>();
if (phoneCursor != null && phoneCursor.getCount() > 0) {
while (phoneCursor.moveToNext()) {
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phoneNumbers.add(phoneNumber);
}
}
if (phoneCursor != null) {
phoneCursor.close();
}
// 如果该联系人有多个电话号码,则删除重复的联系人
if (phoneNumbers.size() > 1) {
// 删除除第一个号码之外的其他号码
Iterator iterator = phoneNumbers.iterator();
iterator.next(); // 跳过第一个号码
while (iterator.hasNext()) {
String phoneNumber = iterator.next();
// 查询要删除的电话号码的Data表的ID
Cursor dataCursor = contentResolver.query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.MIMETYPE + " = ?" + " AND " +
ContactsContract.Data.CONTACT_ID + " = ?" + " AND " +
ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?",
new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
String.valueOf(contactId), phoneNumber},
null);
if (dataCursor != null && dataCursor.getCount() > 0) {
while (dataCursor.moveToNext()) {
long dataId = dataCursor.getLong(dataCursor.getColumnIndex(ContactsContract.Data._ID));
// 根据Data表的ID删除电话号码
Uri uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, dataId);
contentResolver.delete(uri, null, null);
}
}
if (dataCursor != null) {
dataCursor.close();
}
}
}
// 将已处理过的联系人ID添加到HashSet
contactsIds.add(contactId);
}
}
if (cursor != null) {
cursor.close();
}
}
}
你可以在你的Android应用程序中使用上述代码来删除重复的联系人。只需调用removeDuplicateContacts()
方法并传递一个ContentResolver对象即可。请确保在使用ContentResolver之前已经获取了适当的权限。