最近有个关于通讯录开发的需求,需求很简单:根据手机号码查询姓名。之前有获取通讯录列表的代码如下:

/*** 获取本机手机联系人列表* * @author yinbiao* @date 2016-4-5 上午11:03:48* @param context* @return*/public synchronized static List<MocamContact> getLocalPhoneContacts(Context context) {String[] projection = { Phone.DISPLAY_NAME, Phone.NUMBER };List<MocamContact> list = new ArrayList<MocamContact>();ContentResolver resolver = context.getContentResolver();// 获取手机联系人Cursor cursor = resolver.query(Phone.CONTENT_URI, projection, null, null, null);if (cursor != null) {while (cursor.moveToNext()) {// 得到手机号码String phoneNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));// 如果不是正確的手機號碼 跳过当前循环if (!isMobileNomber(phoneNumber)) {continue;}// 得到联系人名称String name = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));MocamContact contact = new MocamContact(phoneNumber, name);list.add(contact);}cursor.close();}return list;}
/*** 判断是否是正确的手机号码* * @author yinbiao* @date 2016-4-6 下午3:17:17* @param mobileNumber* @return*/public static boolean isMobileNomber(String mobileNumber) {if (TextUtils.isEmpty(mobileNumber)) {return false;}Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");Matcher m = p.matcher(mobileNumber);return m.matches();}

实现该需求,我只需要拿到手机号码,然后去 Phone.CONTENT_URI表查询姓名字段即可,so 代码如下:

/*** 根据手机号码查询联系人姓名* * @author yinbiao* @date 2016-4-6 上午9:29:42* @param context* @param phoneNum* @return*/public synchronized static String getDisplayNameByPhone(Context context, String phoneNum) {String displayName = null;ContentResolver resolver = context.getContentResolver();Cursor cursor = resolver.query(Phone.CONTENT_URI, projection, Phone.NUMBER + "=?",new String[]{phoneNum}, null);if (cursor != null) {while (cursor.moveToNext()) {displayName = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));if (!TextUtils.isEmpty(displayName)) {break;}}}return displayName;}

是不是比较简单?但是  坑  出现了,真机调试中,根据手机号码怎么都查询不到姓名,反复检查代码没有发现问题所在,百思不得其解。

然后反其道行之,写了一个根据姓名查询手机号码的demo,代码如下:

       public synchronized static String getPhoneByName(Context context, String name) {String displayName = null;ContentResolver resolver = context.getContentResolver();Cursor cursor = resolver.query(Phone.CONTENT_URI, projection, Phone.DISPLAY_NAME + "=?",new String[]{name}, null);if (cursor != null) {while (cursor.moveToNext()) {displayName = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));if (!TextUtils.isEmpty(displayName)) {break;}}}return displayName;}

然后输入通讯录中的某一个联系人姓名进行查询,得到了手机号码显示:

仔细一看,数据库中存的手机号码中间居然有空格,终于知道了问题的原因,这下好改了,只需要查询是,给手机号码中间特定的位置插入空格就OK,查资料发现有些系统没有空格,有些系统中间加的是横线 “-”;所以将代码做如下改动:

/*** 根据手机号码查询联系人姓名* * @author yinbiao* @date 2016-4-6 上午9:29:42* @param context* @param phoneNum(传入纯数字手机号码)* @return*/public synchronized static String getDisplayNameByPhone1(Context context, String phoneNum) {String displayName = null;String phone1 = new StringBuffer(phoneNum.subSequence(0, 3)).append(" ").append(phoneNum.substring(3, 7)).append(" ").append(phoneNum.substring(7, 11)).toString();String phone2 = new StringBuffer(phoneNum.subSequence(0, 3)).append("-").append(phoneNum.substring(3, 7)).append("-").append(phoneNum.substring(7, 11)).toString();ContentResolver resolver = context.getContentResolver();Cursor cursor = resolver.query(Phone.CONTENT_URI, projection, Phone.NUMBER + " in(?,?,?)", new String[] {phoneNum, phone1, phone2 }, null);if (cursor != null) {while (cursor.moveToNext()) {displayName = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));if (!TextUtils.isEmpty(displayName)) {break;}cursor.close();}}return displayName;}

再次运行,输入11位手机号码,正确显示该号码对应的联系人姓名。

android通讯录根据手机号码查询姓名相关推荐

  1. android查询联系人的电话号码,android通讯录根据手机号码查询姓名

    最近有个关于通讯录开发的需求,需求很简单:根据手机号码查询姓名.之前有获取通讯录列表的代码如下: /** * 获取本机手机联系人列表 * * @author yinbiao * @date 2016- ...

  2. Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日

    public void testGetAllContact() throws Throwable{//获取联系人信息的UriUri uri = ContactsContract.Contacts.CO ...

  3. ios 通讯录 通过电话号码 查询姓名

    #pragma mark - 检索是否通讯录里有此号码 -(NSString *)getNameBytel:(NSString *)telstr { NSMutableArray* personArr ...

  4. android通讯录操作批量查询删除更新头像vcf文件写入读取便捷方法

    读取本地通讯录: private List<PhoneModel> getLocalData2() {List<PhoneModel> mapLoc = new LinkedL ...

  5. Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人

    Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人 公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询 ...

  6. Android通讯录查询篇--ContactsContract.Data 二

    2019独角兽企业重金招聘Python工程师标准>>> 上次说Data.MIMETYPE这个玩意很重要,官方的文档中描述了一大段的话.里面比较重要的几点是: 1.在Data中有一大段 ...

  7. android通讯录完整功能实现,Android实现通讯录功能

    本文实例为大家分享了Android通讯录案例,供大家参考,具体内容如下 实战演练--通讯录 1.功能描述:通过SQLite实现数据库的增删改查 2.技术要点:SQLite的基本操作 3.实现步骤: ① ...

  8. python实现手机通讯录_python+uiautomator2实现需求:从通讯录添加手机号码作为SOS紧急号码...

    # 实现需求:从通讯录添加手机号码,若存在旧的SOS号码,先删除再添加,若通讯录中没有号码,需先新建. import uiautomator2as u2 from timeimport sleep i ...

  9. python模拟通讯录的删除功能_python+uiautomator2 实现需求:从通讯录添加手机号码,若存在旧的 SOS号码,先删除再添加,若通讯录中没有号码,需先新建。...

    # 实现需求:从通讯录添加手机号码,若存在旧的SOS号码,先删除再添加,若通讯录中没有号码,需先新建. import uiautomator2 as u2 from time import sleep ...

最新文章

  1. Asp.net Web API 返回Json对象的两种方式
  2. ios推送服务,php服务端
  3. 杨氏干涉的模拟的MATLAB仿真
  4. 【数据结构总结】第七章 查找
  5. 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
  6. maven下载源码linux,Maven 下载 源码和javadoc 命令
  7. node.js异步式IO与事件式编程
  8. Delphi下DLL调用以及共享数据库连接
  9. Node概述_note
  10. 只十分钟,唾手可得的工作机会就被我搞砸了!
  11. Javascript特效:秒杀倒计时
  12. 2021年最佳开源软件榜单出炉!
  13. 松下弧焊机器人 调电压_松下焊接机器人-基本操作篇.pdf
  14. JWT令牌生成与校验
  15. ps(AI)快捷键学习汇总
  16. 【全栈开发实战小草看书之Web端(一)开发环境】
  17. WSTMart 分销说明,三级分销与返利
  18. 网易猛犸:数据质量漫谈
  19. python snmp
  20. [转] Attach、Detach和DeleteObject

热门文章

  1. 简单获取unix时间戳
  2. 手机克隆常见问题 安卓版手机便签怎么导出
  3. 浅显易懂地看LLC变换器(一)
  4. jackson序列化首字母大写amp;jackson序列化结果字段名重复
  5. 2022温州经开区沙城街道办事处招聘编外人员综合试题及答案
  6. ceph-deploy osd activate xxx bluestore ERROR
  7. 阿里云服务器ECS Ubuntu16.04-64-bit学习之一:配置桌面(进阶-脚本一键执行)
  8. 朱光领衔百度金融高管团队曝光,要憋大招的节奏?
  9. 22.3TB全国1-20级谷歌离线卫星影像终于出炉了
  10. 计算机硬件和工作原理,课题计算机硬件和基本工作原理