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;
	}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安辉就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值