项目中用到了联系人根据字母排序,在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;
}

最新文章

  1. putty-不输入密码直接登陆
  2. 【嵌入式开发板】8月终极暑促迅为Cortex-a9四核入门开发板
  3. 【BZOJ】【2844】albus就是要第一个出场
  4. java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ex.activity/com.ex.activity.LoginActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class
  5. python Debug 单步调试
  6. jcenter那些事儿
  7. modalDialog的使用,图片切换,点击图片时打开一个窗体,并显示信息
  8. 计算机程序的思维逻辑 (64) - 常见文件类型处理: 属性文件/CSV/EXCEL/HTML/压缩文件
  9. DICOM图像转出为bmp格式图像方法(matlab程序实现)
  10. [Swift]LeetCode506. 相对名次 | Relative Ranks
  11. Linux环境下安装nginx
  12. Nginx http2.0
  13. [Codeforces266E]More Queries to Array...——线段树
  14. libev
  15. Duplicate Elimination in Scrapy(转)
  16. java连接hbase时出现....is accessible from more than one module:
  17. Git远程操作详解【转】
  18. Qt计算两个时间差
  19. 前端基础-css(3)
  20. Android应用开发基础之二:数据存储和界面展现(二)

热门文章

  1. zookeeper工作原理、安装配置、工具命令简介
  2. Cannot run gnome extension in browser
  3. SpringMVC自定义处理器里的那些事
  4. 代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载
  5. mysql 连接慢的问题(超过了1秒)
  6. js判断地址转向
  7. 思科交换机配置DHCP的四个方面
  8. (新年快乐)ABP理论学习之本地化(2016第一篇)
  9. RxJava 备注
  10. CSS选择器小结