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,大家单独调试时记得增加访问联系人权限

  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. /** 
  45.  * 根据联系人ID得到联系人号码 
  46.  */  
  47. private static String getContactNumber(int contactId,ContentResolver cr){  
  48.        Cursor phones = cr.query(    
  49.                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,    
  50.                null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID    
  51.                        + " = " + contactId, null, null);  
  52.        String phoneNumber="";  
  53.        if(phones.moveToNext()){    
  54.            phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));    
  55.        }  
  56.        phones.close();  
  57.        return phoneNumber;  
  58. }  
时间: 2024-10-22 21:07:06

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

三星Note4升级版现身:Android5.0+骁龙810成标配

此前曾有报道称,三星GalaxyNote 4将推出升级版本,搭载 骁龙810处理器,现在国外媒体PhoneArena再次给出消息称,该版本三星Note 4已经现身Geekbench跑分数据库中.三星Note 4升级版现身该设备型号为SM-N916S,媒体推测很可能是三星Note 4的升级版(Note 4普通版设备型号为SM-N910).据Geekbench网站页面显示,SM-N916S这款设备搭载MSM8994处理器,也就是骁龙810.三星Galaxy Note 4除处理器有所升级外,三星Not

ie6下点a标签不会submit把javascript:void(0)改成###

文章简介:IE6下javascript:void(0)不submit的另类方法. 今天解决一BUG,在ie6下点a标签不会submit,原来在a的href上写的是javascript:void(0);把javascript:void(0)改成###,问题解决.但是如果这个html是程序员喷的,那可就要走大流程了.咨询大师,于是留下了这千古绝唱. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

c语言-C++代码改成C语言代码,没学过C++好多看不懂啊(泪奔······)求大神指点,我用的VC6.0

问题描述 C++代码改成C语言代码,没学过C++好多看不懂啊(泪奔······)求大神指点,我用的VC6.0 代码如下, #include "winsock2.h" #include "Winsnmp.h" #include 这里是string以下都要用 < 和 > 括起来(不知为何不显示=,=) #include vector #include algorithm #include iostream #pragma comment(lib,"

Microsoft.Jet.OLEDB.4.0 改成Microsoft.ACE.OLEDB.12.0

问题描述 Microsoft.Jet.OLEDB.4.0 改成Microsoft.ACE.OLEDB.12.0 运行环境: windows 10 专业版 64位 .SQL2008 在sql2008新建数据库的时候提示"因为 OLE DB 访问接口 'Microsoft.Jet.OLEDB.4.0' 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询" 电脑上已安装好了Microsoft.ACE.OLEDB.12.0 .现在就差把链接串口Microsoft.Jet.OLEDB

微软那个signalr-self-host的示例程序能否改成.NET Framework 4.0的版本?

问题描述 微软那个signalr-self-host的示例程序能否改成.NETFramework4.0的版本?以下链接是微软那个signalr-self-host的示例程序的详细教程和下载http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-hosthttps://code.msdn.microsoft.com/SignalR-Self-Host-Sample-6da0f383它的功能是符合我的开发要求的,但是有

asp.net网站HTtp响应头HTTP/1.0怎么改成HTTP/1.1

问题描述 目前网站HTTP响应头是HTTP/1.0版本,请问怎样可以改成HTTP/1.1版本 解决方案 解决方案二:没人懂么?没人懂么?

&amp;amp;lt;%# Eval(&amp;amp;quot;Name&amp;amp;quot;,&amp;amp;quot;~/images/{0}&amp;amp;quot;) %&amp;amp;gt; 想将&amp;amp;quot;~/images/{0}&amp;amp;quot;这部分改成变量怎么做,谢谢!

问题描述 各位兄弟们我想<%#Eval("Name","~/images/{0}")%>把这个"~/images/{0}"用一个变量来代替可以吗?下面的是原语句:<asp:ImageButtonID="ImageButton1"runat="server"CommandArgument='<%#Eval("FullPath")%>'commandName=&

SQLids.vbs 0.7(最终版,以后改成gui界面的)_vbs

是有这个问题的.第一,应当用正则判断较好.第二,我用循环加返回结果大于30个长度就退出循环,我相信没有表名和字段名大于30个字母的,但是字段值有可能大于,这个地方解决的不够好.但是一般是用来查后台的管理员的用户名和密码,所以就放弃了. 复制代码 代码如下: set arg=wscript.arguments If (LCase(Right(Wscript.fullname,11))="Wscript.Exe") Then Wscript.Quit End If if arg.count

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

/******************************************************************************** * matrix-gui-2.0 将javascript文件夹改成js文件夹 * 说明: * 今天在测试的matrix-gui-2.0的时候总是找不到javascript中的js文件,直接访问也 * 提示没有权限索性直接将javascript文件夹名字修改为js,结果可以访问了,好像这个问 * 题之前有遇到过,没有去解决. * * 2