Android聯系人--聯系人查詢2
1 首先我們要明白,在2.0後,聯系人資料庫大改了,導緻之前的查詢可能失效,深入了解請參考 點選打開連結
2 我們在查詢聯系人一般都是 ContactsContract.Contacts.CONTENT_URI(2.0後谷歌建議的類),可是在此類隻可以查詢到姓名,并不能查詢到手機号碼,如果需要需要手機号碼(絕大多數情況下都需要查詢),這個時候我們就需要在循環内查詢Phone表,這樣循環裡面嵌套循環,循環的開關遊标,如果聯系人少還好說, 如果多,就會變的非常卡卡,本人100+聯系人,在2G記憶體S3下都很卡。是以我們要找個方法來解決他。
3 我們需要明白如下,系統是以姓名作為唯一标示,如果 系統存在 (習,10086,李 10000,王 10010,習 110) 這幾個聯系人。在系統通訊錄下是3個,因為系統會自動合并
在QQ通訊錄,360通訊錄,百度通訊錄都是3個,而且我們通過ContactsContract.Contacts.CONTENT_URI也是3個,
但是通過Phone查詢是4個,通過RawContact查詢的是4個,通過Phone和RawContact查詢的是聯系人的詳細資訊,是有電話号碼的,但是通 過ContactsContract.Contacts.CONTENT_URI是沒有電話号碼的,是以我們為了提高效率,必須考慮是否查詢Phone這個url
4 通過phone查詢之後,聯系人要比系統顯示的多,且姓名相同的沒有自動合并,這就需要我們收到處理了
5 關鍵在于add2List方法,以姓名為唯一标示,将聯系人合并,這樣隻需要一個循環,效率大為提高,而且和QQ,360,系統一樣的效果
6 本人的做法,開機啟動一個服務,這個服務去查詢聯系人資料,然後放到application中,因為這個服務一直在背景運作,是以進入到聯系人界面非常非常快(但是360和QQ電腦管家可以禁止我的開機啟動,和服務被kill後不能再次重新啟動,方法是我們可以比360更流氓,開個鬧鐘,不停發廣播,監聽各種廣播事件........)
import android.provider.ContactsContract.CommonDataKinds.Phone;
/**
* 查詢聯系人
*/
private void queryContact() {
String[] projection = { Phone._ID, Phone.DISPLAY_NAME, Phone.DATA1,
Phone.CONTACT_ID, "sort_key", Phone.PHOTO_ID }; // 查詢的列
asyncQuery.startQuery(0, null, Phone.CONTENT_URI, projection, null,
null, "sort_key COLLATE LOCALIZED asc"); // 按照sort_key升序查詢
}
class MyAsyncQueryHandler extends AsyncQueryHandler {
public MyAsyncQueryHandler(ContentResolver cr) {
super(cr);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
switch (token) {
case 0:// 查詢聯系人
if (cursor != null && cursor.getCount() > 0) {
list = new ArrayList<ContactBean>();
while (cursor.moveToNext()) {
ContactBean cb = new ContactBean();
cb.contactId = cursor.getInt(0);
cb.displayName = cursor.getString(1);
String number = cursor.getString(2);
if (number.contains("+86")) {
cb.phoneNum = number.substring(3, number.length());
} else {
cb.phoneNum = number;
}
cb.contactId = cursor.getInt(3);
cb.sortKey = cursor.getString(4);
//if (null != cb.displayName) {// 将姓名轉換為拼音,需要pinyin4j-2.5.0.jar
// cb.pinyin = Tools.chineseToPinYin(cb.displayName);
//}
cb.photoId = cursor.getLong(5);
cb.list.add(number);
//add2List(list, cb);
Log.e("MainActivity", cb.toString());
}
//setContactAdapter(list);
}
break;
}
}
}
/**
* 以姓名為唯一标示,将姓名相同的号碼聯系人合并
*
* @param list
* @param ContactBean
*/
public void add2List(ArrayList<ContactBean> list, ContactBean cb) {
int size = list.size();
for (int i = 0; i < size; i++) {
if (list.get(i).displayName.equals(cb.displayName)) {
int length = cb.list.size();
for (int j = 0; j < length; j++) {
list.get(i).list.add(cb.list.get(j));
}
return;
}
}
list.add(cb);
}
public class ContactBean {
public int contactId;// 聯系人ID
public int selected;
public String displayName;// 姓名
public String phoneNum;// 顯示的電話号碼
public String sortKey;// sortKey
public Long photoId;// 頭像ID
public String lookUpKey;// lookUpKey
public String pinyin;// 姓名的中文拼音
public ArrayList<String> list;// 存儲姓名的集合
public ContactBean() {
list = new ArrayList<String>();
}
public ContactBean(int contactId, int selected, String displayName,
String phoneNum, String sortKey, Long photoId, String lookUpKey,
String pinyin, ArrayList<String> list) {
super();
this.contactId = contactId;
this.selected = selected;
this.displayName = displayName;
this.phoneNum = phoneNum;
this.sortKey = sortKey;
this.photoId = photoId;
this.lookUpKey = lookUpKey;
this.pinyin = pinyin;
this.list = list;
}
@Override
public String toString() {
return "ContactBean [contactId=" + contactId + ", selected=" + selected
+ ", displayName=" + displayName + ", phoneNum=" + phoneNum
+ ", sortKey=" + sortKey + ", photoId=" + photoId
+ ", lookUpKey=" + lookUpKey + ", pinyin=" + pinyin + ", list="
+ list + "]";
}
}