我想要使用下面的代碼獲取手機通訊錄中所有可用聯繫人的詳細信息。但面臨重複價值的小問題。如何獲取所有聯繫人的名字,姓氏,電子郵件,電話號碼等,不需要重複
EDITED
實際代碼開始: -
private String refreshData() {
String emaildata = "";
try {
ContentResolver cr = getBaseContext().getContentResolver();
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP
+ " = '" + ("1") + "'";
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
Cursor cur = cr
.query(ContactsContract.Contacts.CONTENT_URI,
null,
selection
+ " AND "
+ ContactsContract.Contacts.HAS_PHONE_NUMBER
+ "=1", null, sortOrder);
if (cur.getCount() > 0) {
Log.i("Content provider", "Reading contact emails");
while (cur.moveToNext()) {
mContactSet.add(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID)));
}
} else {
emaildata += "Data not found.";
}
cur.close();
Log.i(TAG, "Total contacts = " + mContactSet.size());
Iterator<String> iterator = mContactSet.iterator();
while (iterator.hasNext()) {
String contactId = iterator.next();
Log.i(TAG, "ID ==> " + contactId);
// Create query to use CommonDataKinds classes to fetch
// emails
Cursor emails = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = " + contactId, null, null);
// Name
String whereName = ContactsContract.Data.MIMETYPE
+ " = ? AND "
+ ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID
+ " = ?";
String[] whereNameParams = new String[] {
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE,
contactId };
Cursor nameCur = cr
.query(ContactsContract.Data.CONTENT_URI,
null,
whereName,
whereNameParams,
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCur.moveToNext()) {
String given = nameCur
.getString(nameCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCur
.getString(nameCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCur
.getString(nameCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
Log.i(TAG, "First Name ==> " + given);
Log.i(TAG, "Last Name ==> " + family);
Log.i(TAG, "Display ==> " + display);
}
nameCur.close();
}
} catch (Exception e) {
emaildata += "Exception : " + e + "";
}
return emaildata;
}
修改了查詢,並得到一些更好的結果,但仍然是問題是相同的部分聯繫人並獲得重複的值。
UPDATE: - 我已經使用HashSet獲得唯一的聯繫人ID,我也順利獲得,但是當我從聯繫人ID獲取名稱時,我獲得了2-3次相同的值聯繫人。我非常困惑,這是怎麼可能的,相同的聯繫人存儲2-3次相同的ID?
我需要使用HASHSET的名字,姓氏,電話號碼,電子郵件等嗎?還有其他的方法嗎?
如果有可能,你可以嘗試DISTINCT與條件 –
我有這個代碼獲取聯繫人。如何添加DISTINCT在這裏,因爲我是聯繫人的新手? String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP +「='」+(「1」)+「'」; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +「COLLATE LOCALIZED ASC」; 光標CUR = cr.query(\t \t ContactsContract.Contacts.CONTENT_URI,空,選擇+ 「和」 + ContactsContract.Contacts.HAS_PHONE_NUMBER + 「= 1」,NULL,中將sortOrder); – Scorpion
@Scorpion使用java hashmap,HashSet或Java集合中的任何邏輯刪除重複項! –