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

/**

* 获取本机手机联系人列表

*

* @author yinbiao

* @date 2016-4-5 上午11:03:48

* @param context

* @return

*/

public synchronized static List getLocalPhoneContacts(Context context) {

String[] projection = { Phone.DISPLAY_NAME, Phone.NUMBER };

List list = new ArrayList();

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查询联系人的电话号码,android通讯录根据手机号码查询姓名相关推荐

  1. android查询联系人的电话号码,Android实现获取联系人电话号码功能

    本篇文档主要记录一下获取联系人的电话号码的一种方式. 1.选择联系人 ............ //构造一个隐式的Intent,拉起联系人界面 final Intent pickIntent = ne ...

  2. 同步Android手机联系人到iPhone手机通讯录

    同步Android手机联系人到iPhone手机通讯录 最近刚好同步过一次,记录下 首先,我是基于 Google Gmail 同步,因为 Google 对 Android 的支持,联系人本身可以很方便同 ...

  3. android通讯录根据手机号码查询姓名

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

  4. android恢复联系人,如何从Android手机恢复联系人[最佳方式]

    有没有简单的方法 从Android设备恢复已删除/丢失的联系人? 各种原因将导致Android手机上的数据丢失. 例如,意外删除可能会导致电话号码丢失,而一些错误的操作也可能导致联系人丢失. 此外,技 ...

  5. android查询联系人的电话号码,获取sim卡联系人电话号码

    [android]代码库private void getSimContacts(String str){ Intent intent = new Intent(); intent.setData(Ur ...

  6. android查询联系人的电话号码,如何在Android中检索联系人姓名和电话号码

    在Android清单中: 然后在活动中: editText.setOnFocusChangeListener(new OnFocusChangeListener(){ @Override public ...

  7. android 设置联系人头像代码,Android根据电话号码获得联系人头像实例代码

    在日常Android手机的使用过程中,根据电话号码获得联系人头像,是经常会碰到的问题.本文即以实例形式讲述了Android根据电话号码获得联系人头像是实现代码.分享给大家供大家参考之用.具体方法如下: ...

  8. android 设置联系人头像代码,android如何取得本地通讯录的头像的原图的实现代码...

    本文介绍了android如何取得本地通讯录的头像的原图的实现代码,分享给大家,也给自己留个笔记 如果想通讯录进入详情页,那么最重要的参数就是contactId,这个是联系人的唯一标识 getListV ...

  9. Android读取联系人姓名、电话

    一.<Android应用开发揭秘>代码的问题 在该书上, int nameIndex  = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME); ...

最新文章

  1. list redis 怎样做排行_学 Redis 的 7000 字小结!!!
  2. js变量传递给less_如何利用webpack实现一键换肤(CSS变量替换)
  3. 用Unity快速开发太空飞机大战游戏实战经验分享(上)
  4. sql server系统表详细说明(转)
  5. 通过异常处理错误-2
  6. 快速从入门到精通!mysql删除语句姓李的语句
  7. Win10彻底关闭Antimalware Service Executable占用内存过高问题
  8. python——argsort函数
  9. 时间戳与全球唯一性标识
  10. 90后男屌丝如何让淘宝客日赚10万滴
  11. 手机芯片命名规则详解
  12. 网络笔记--接入网及网络运营商
  13. Minimum supported Gradle version is 6.1.1. Current version is 5.6.4.
  14. python 3.x语句print_Python 3.x语句print(1,2,3,sep=’.’)
  15. ActiveMQ系列—ActiveMQ中的Queue和Topics
  16. arcmap添加字段的类型_ArcGIS 字段数据类型
  17. android利用EpMedia给录像添加时间水印
  18. Springboot手机验证码
  19. 计算机专业去支教学到什么,支教的收获及感悟4篇_大学生支教感想
  20. 高校房屋管理系统有哪些模块?

热门文章

  1. 华为鸿蒙新浪微博,华为多款机型开启鸿蒙尝鲜:微博已适配HarmonyOS小尾巴
  2. 在c++中,operator怎么使用
  3. 11个精美网页——Web前端开发技术课程大作业,期末考试,Dreamweaver简单网页制作
  4. 福州大学计算机考研资料汇总
  5. 还不懂Binder的原理?你损失了一张腾讯offer
  6. 自己整理的财务知识(财务比率)(英文不标准是为了自己建立自定义字段而已)
  7. 江苏linux系统自考试卷,【历年真题】2020年8月江苏自考专科《操作系统概论》真题与答案...
  8. 论文小结——CenterPoint
  9. 使用PWM控制来实现电压的变化控制
  10. Matlab使用Camera Calibrator工具箱标定相机