安装 whatsapp 时获取联系人会提供重复的条目
Fetching contacts when whatsapp installed gives duplicated entries
我正在从 android 获取联系人并将其存储在数据库中。在模拟器上测试它并且它正在工作。但是当我在我的 phone 上测试该应用程序时,我得到了使用 Whatsapp 的联系人的重复条目。下面是代码片段。
class LoadContactAsync extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
Cursor people = getContentResolver()
.query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
"UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
+ ") ASC");
while (people.moveToNext()) {
final String contactId = people.getString(people
.getColumnIndex(ContactsContract.Contacts._ID));
final String contactName = people
.getString(people
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
final String image_uri = people
.getString(people
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
final String hasPhone = people
.getString(people
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if ((Integer.parseInt(hasPhone) > 0)) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null,
"UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
while (phones.moveToNext()) {
final String phoneNumber = phones
.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
db.addContact(new Contact(contactName, phoneNumber, image_uri));
}
phones.close();
}
}
people.close();
return null;
}
@Override
protected void onPostExecute(String s) {
pd.dismiss();
showToast("Contacts Added Successfully");
db.close();
}
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(MainActivity.this, "Please Wait...",
"Fetching One Time Contacts", true, false);
}
}
截图如下
没有安装 Whatsapp
安装了 Whatsapp
任何帮助将不胜感激。
谢谢
对于可能遇到同样错误的人。这对我有用。在你的数据库中将 Phone 数字列设为 unique
table..
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NO + " TEXT UNIQUE," + KEY_IMAGE + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
将所有联系人数据存储在一个数组列表中(包括重复项),
ArrayList mDetailsArrayList =new ArrayList<>();
然后在 postExecute 中使用 removeDuplicates() 方法删除重复条目;
private ArrayList<Contact> removeDuplicate(ArrayList<Contact> contactArrayList){
Set set = new TreeSet(new Comparator() {
@Override
public int compare(Object lhs, Object rhs) {
if (lhs instanceof Contact && rhs instanceof Contact) {
if (((Contact) lhs).getContactName().equalsIgnoreCase(((Contact) rhs).getContactName())) {
return 0;
}
}
return 1;
}
});
set.addAll(contactArrayList);
System.out.println("\nAfter removing duplicates\n");
final ArrayList newList = new ArrayList(set);
System.out.println(set);
return newList;
}
现在这个返回的数组列表将保存真实数据的
如果您不想使用数据库来避免重复条目,请使用以下代码
private HashMap<String, ContactModel> getContactsList() {
String[] projection = new String[]{ContactsContract.Contacts._ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.PHOTO_URI};
Cursor phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
String lastPhoneName = " ";
if (phones.getCount() > 0) {
while (phones.moveToNext()) {
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String contactId = phones.getString(phones.getColumnIndex(ContactsContract.Contacts._ID));
String photoUri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (!name.equalsIgnoreCase(lastPhoneName)) {
lastPhoneName = name;
contactDetail.put(contactId, new ContactModel(contactId, name, phoneNumber, photoUri));
Log.d("getContactsList", name + "---" + phoneNumber + " -- " + contactId + " -- " + photoUri);
}
}
}
phones.close();
return contactDetail;
}
我正在从 android 获取联系人并将其存储在数据库中。在模拟器上测试它并且它正在工作。但是当我在我的 phone 上测试该应用程序时,我得到了使用 Whatsapp 的联系人的重复条目。下面是代码片段。
class LoadContactAsync extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
Cursor people = getContentResolver()
.query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
"UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
+ ") ASC");
while (people.moveToNext()) {
final String contactId = people.getString(people
.getColumnIndex(ContactsContract.Contacts._ID));
final String contactName = people
.getString(people
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
final String image_uri = people
.getString(people
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
final String hasPhone = people
.getString(people
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if ((Integer.parseInt(hasPhone) > 0)) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null,
"UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
while (phones.moveToNext()) {
final String phoneNumber = phones
.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
db.addContact(new Contact(contactName, phoneNumber, image_uri));
}
phones.close();
}
}
people.close();
return null;
}
@Override
protected void onPostExecute(String s) {
pd.dismiss();
showToast("Contacts Added Successfully");
db.close();
}
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(MainActivity.this, "Please Wait...",
"Fetching One Time Contacts", true, false);
}
}
截图如下
没有安装 Whatsapp
安装了 Whatsapp
任何帮助将不胜感激。 谢谢
对于可能遇到同样错误的人。这对我有用。在你的数据库中将 Phone 数字列设为 unique
table..
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NO + " TEXT UNIQUE," + KEY_IMAGE + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
将所有联系人数据存储在一个数组列表中(包括重复项),
ArrayList mDetailsArrayList =new ArrayList<>();
然后在 postExecute 中使用 removeDuplicates() 方法删除重复条目;
private ArrayList<Contact> removeDuplicate(ArrayList<Contact> contactArrayList){
Set set = new TreeSet(new Comparator() {
@Override
public int compare(Object lhs, Object rhs) {
if (lhs instanceof Contact && rhs instanceof Contact) {
if (((Contact) lhs).getContactName().equalsIgnoreCase(((Contact) rhs).getContactName())) {
return 0;
}
}
return 1;
}
});
set.addAll(contactArrayList);
System.out.println("\nAfter removing duplicates\n");
final ArrayList newList = new ArrayList(set);
System.out.println(set);
return newList;
}
现在这个返回的数组列表将保存真实数据的
如果您不想使用数据库来避免重复条目,请使用以下代码
private HashMap<String, ContactModel> getContactsList() {
String[] projection = new String[]{ContactsContract.Contacts._ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.PHOTO_URI};
Cursor phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
String lastPhoneName = " ";
if (phones.getCount() > 0) {
while (phones.moveToNext()) {
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String contactId = phones.getString(phones.getColumnIndex(ContactsContract.Contacts._ID));
String photoUri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (!name.equalsIgnoreCase(lastPhoneName)) {
lastPhoneName = name;
contactDetail.put(contactId, new ContactModel(contactId, name, phoneNumber, photoUri));
Log.d("getContactsList", name + "---" + phoneNumber + " -- " + contactId + " -- " + photoUri);
}
}
}
phones.close();
return contactDetail;
}