安卓通讯录查询

第一次 写博文 想收藏这篇文章 ,并分享给需要的朋友
本文转载自http://blog.csdn.net/a8380381/article/details/51085612
/**
* 获取本机手机联系人列表
*
* @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;  
    }  

[java] view plain copy

/** 
        * 判断是否是正确的手机号码 
        *  
        * @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 代码如下:
[java] view plain copy

/** 
     * 根据手机号码查询联系人姓名 
     *  
     * @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,代码如下:
[java] view plain copy

      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,查资料发现有些系统没有空格,有些系统中间加的是横线 “-”;所以将代码做如下改动:

[java] view plain copy

/** 
     * 根据手机号码查询联系人姓名 
     *  
     * @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位手机号码,正确显示该号码对应的联系人姓名。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值