天天看點

Android聯系人--聯系人查詢2

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 + "]";
	}

}