天天看點

android5.0聯系人 sort_key改成phonebook_label

項目中用到了聯系人根據字母排序,在android4.0手機上是可以的,但是在android4.4以上的手機排序是亂的,一般字母排序都是根據sort_key這個拼音進行排序,而android5.0這個字段沒有儲存拼音,直接是漢字.

于是我把4.4的手機上聯系人db檔案檢視了一下,發現phonebook_label儲存的是聯系人姓名拼音首字母

如何使用adb指令把聯系人db檔案copy到電腦。

1.手機跟電腦usb資料線進行連接配接,并且電腦端裝了手機usb驅動(簡單說明就是在開發調試環境下)

2.聯系人資料庫copy到sdcard

  cat /data/data/com.android.providers.contacts/databases/contacts2.db > /sdcard/contacts2.db

3.先exit退出adb shell界面  把sdcard的db檔案複制到d盤

  adb   pull  /sdcard/contacts2.db  d:\contacts2.db

以下是我寫的一段查詢資料庫說有聯系人的代碼,根據作業系統不同查詢不同的sort_key,大家單獨調試時記得增加通路聯系人權限

/** 

 * 查找所有聯系人 

 */  

public static list<swwcontact> findallcontacts(contentresolver cr) {  

    list<swwcontact> list = new arraylist<swwcontact>();  

    string[] projection=new string[]{  

            contactscontract.contacts.display_name,  

            contactscontract.contacts.sort_key_primary,  

            contactscontract.contacts._id,  

            contactscontract.contacts.photo_id,  

            contactscontract.contacts.lookup_key};  

    //如果android作業系統版本4.4或4.4以上就要用phonebook_label而不是sort_key字段  

    if(android.os.build.version.sdk_int>=19){  

        projection[1]="phonebook_label";  

    }  

    cursor cursor = cr.query(contactscontract.contacts.content_uri,  

                    projection, null, null,  

                    "sort_key collate localized asc");  

    if (null!=cursor&&cursor.movetofirst()){  

        do {  

            swwcontact cb = new swwcontact();  

            cb.setdisplayname(cursor.getstring(0));  

            string sortkey=cursor.getstring(1);  

            if(sortkey.trim().substring(0,1).matches("[a-z]")){  

                sortkey=sortkey.touppercase();  

            }  

            cb.setsortkey(sortkey);  

            cb.setcontactid(cursor.getint(2));  

            cb.setphotoid(cursor.getlong(3));  

            cb.setlookupkey(cursor.getstring(4));  

               cb.setphonenum(getcontactnumber(cursor.getint(2),cr));  

            list.add(cb);  

        } while (cursor.movetonext());  

        cursor.close();  

    return list;  

}  

 * 根據聯系人id得到聯系人号碼 

private static string getcontactnumber(int contactid,contentresolver cr){  

       cursor phones = cr.query(    

               contactscontract.commondatakinds.phone.content_uri,    

               null, contactscontract.commondatakinds.phone.contact_id    

                       + " = " + contactid, null, null);  

       string phonenumber="";  

       if(phones.movetonext()){    

           phonenumber = phones.getstring(phones.getcolumnindex(contactscontract.commondatakinds.phone.number));    

       }  

       phones.close();  

       return phonenumber;