项目中用到了联系人根据字母排序,在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,大家单独调试时记得增加访问联系人权限

  1. /**
  2. * 查找所有联系人
  3. */
  4. public static List<SWWContact> findAllContacts(ContentResolver cr) {
  5. List<SWWContact> list = new ArrayList<SWWContact>();
  6. String[] projection=new String[]{
  7. ContactsContract.Contacts.DISPLAY_NAME,
  8. ContactsContract.Contacts.SORT_KEY_PRIMARY,
  9. ContactsContract.Contacts._ID,
  10. ContactsContract.Contacts.PHOTO_ID,
  11. ContactsContract.Contacts.LOOKUP_KEY};
  12.  
  13. //如果android操作系统版本4.4或4.4以上就要用phonebook_label而不是sort_key字段
  14. if(android.os.Build.VERSION.SDK_INT>=19){
  15. projection[1]="phonebook_label";
  16. }
  17.  
  18. Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
  19. projection, null, null,
  20. "sort_key COLLATE LOCALIZED asc");
  21. if (null!=cursor&&cursor.moveToFirst()){
  22. do {
  23. SWWContact cb = new SWWContact();
  24. cb.setDisplayName(cursor.getString(0));
  25.  
  26. String sortKey=cursor.getString(1);
  27. if(sortKey.trim().substring(0,1).matches("[a-z]")){
  28. sortKey=sortKey.toUpperCase();
  29. }
  30. cb.setSortKey(sortKey);
  31.  
  32. cb.setContactId(cursor.getInt(2));
  33. cb.setPhotoId(cursor.getLong(3));
  34. cb.setLookUpKey(cursor.getString(4));
  35. cb.setPhoneNum(getContactNumber(cursor.getInt(2),cr));
  36. list.add(cb);
  37. } while (cursor.moveToNext());
  38. cursor.close();
  39. }
  40. return list;
  41. }
  42.  
  43. /**
  44. * 根据联系人ID得到联系人号码
  45. */
  46. private static String getContactNumber(int contactId,ContentResolver cr){
  47. Cursor phones = cr.query(
  48. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  49. null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID
  50. + " = " + contactId, null, null);
  51. String phoneNumber="";
  52. if(phones.moveToNext()){
  53. phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  54. }
  55. phones.close();
  56. return phoneNumber;
  57. }

android5.0联系人 sort_key改成phonebook_label的更多相关文章

  1. .NET Core 2.0 项目的智能提示是英文,改成中文的解决方案

    截至目前为止(2017.09.21),Microsoft 官方并没有提供 .NET Core 2.0 正式版的多语言安装包. 因此,在 Visual Studio 2015 Update 3 和 Vi ...

  2. OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

           OpenGL ES和OpenGL的图标 关于“OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out”这个问题,做一阐述: 1.关键字的小修 ...

  3. Nuxt 2.0 需要将pug-loader改成pug-plain-loader

    Nuxt 2.0 需要将pug-loader改成pug-plain-loader npm i pug-plain-loader -D 解决问题!! 参考链接 https://my.oschina.ne ...

  4. matrix-gui-2.0 将javascript文件夹改成js文件夹

    /******************************************************************************** * matrix-gui-2.0 将 ...

  5. 复利计算5.0(改成Java版本)与 单元测试

    //由于C语言版本不方便单元测试,所以改成了java版本,部分代码如下:import java.util.Scanner; public class FuLi{ public static void ...

  6. Android5.0之Activity的转场动画

    Activity的转场动画很早就有,但是太过于单调,样式也不好看,于是Google在Android5.0之后,又推出的新的转场动画,效果还是非常炫的,今天我们一起来看一下. 1.旧转场动画回顾 首先我 ...

  7. Android5.0和Android6.0适配

    gradle配置项 compileSdkVersion 用哪个 Android SDK 版本编译你的应用.因此我们强烈推荐总是使用最新的 SDK 进行编译.在现有代码上使用新的编译检查可以获得很多好处 ...

  8. python学习——将while循环改成函数

    笨办法学python第33节 这一节主要学习内容是while循环,记录内容为将while改成函数,首先源代码如下: i = 0 numbers = [] while i < 6: print & ...

  9. zepto插件 countdown 倒计时插件 从jquery 改成 zepto

    插件特色:支持zepto库  支持时间戳格式 支持年月日时分秒格式 countdown 由jquery依赖库改成zepto zepto的event机制与jquery不同,所以更换之后代码不能正常运行 ...

随机推荐

  1. nodejs 单元测试

    之前项目开发因为改进度,基本都是粗放式开发.为了提高代码质量,单元测试是必不可少的. 针对restful api ,用supertest 测试框架.针对nodejs,引入mocha 和should 可 ...

  2. Windows服务安装

    运行cmd 输入:cd C:\Windows\Microsoft.NET\Framework\v4.0.30319  按回车 输入安装服务路径:如(installutil.exe D:\Project ...

  3. SweetAlert-js超酷消息警告框插件

    简要教程 SweetAlert是一款神奇的javascript弹出消息警告框插件. 来通过一张gif图片看看SweetAlert的效果: 使用方法 要使用该插件,首先要在html的header中引入以 ...

  4. zabbix监控报错zabbix server is not running解决方法

    问题描述: 布置好zabbix监控,正常运行.但是重启了虚拟机服务器之后,页面出现如下的报错,而且设置的报信息也是失效的:

  5. centos下python中添加easygui模块

    前提:python中要集成Tkinter,Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同 ...

  6. 一个基于jQuery的移动端条件选择查询插件(原创)

    下载插件 目前给出的下载是混淆了后的代码 愿意一起探讨的可以找我要源码 使用方式: var ConditionsChoose = $("#Screening").Condition ...

  7. 科学计算软件——Octave安装

    Octave是一个旨在提供与Matlab语法兼容的开放源代码科学计算及数值分析的工具,是Matlab商业软件的一个强有力的竞争产品. 参考:[ML:Octave Installation] Gener ...

  8. Delphi自己隐藏自定义弹出列表

    先上代码 procedure TForm3.Timer1Timer(Sender: TObject); var Point: TPoint; Name: array[0..255] of Char; ...

  9. JPEG文件结构

    JPEG文件由八个部分组成,每个部分的标记字节为两个,首字节固定为:0xFF,当然,准许在其前面再填充多个0xFF,以最后一个为准.下面为各部分的名称和第二个标记字节的数值,用ultraedit的16 ...

  10. Web应用程序的自动化测试库-FluentAutomation

    FluentAutomation是流畅的自动化应用编程接口,支持Selenium和WatiN 连同它们所有的风格和驱动程序.自从Fluient支持Selenium,那就意味着你可以使用Selenium ...