項目中用到了聯系人根據字母排序,在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;