Android通过来电号码识别姓名。

项目中遇到需要通过来电号码获取到联系人姓名的需求。

然而,简单地通过联系人数据库的Filter来获取来电号码在部分手机是获取不到保存的联系人的,比如三星S3,需要获取通信录保存的有+86等国区码,而来电没有+86的情况。部分手机也会出现保存的没有+86,来电有+86无法获取的情况。

那么,我们就需要通过获取所有联系人的电话号码,通过比较来电号码来知道该来电号码的姓名是谁。

来电号码还有可能是国外的,因此还需要国家区码。

(如果我们需要识别飞信或者是其他的前缀,直接添加在countryCode即可。)

 因为要搜索所有的联系人,那么效率也是我们要考虑的问题,这里的从数据库获取并判断是否相等,

大部分手机能够在20ms获取到30多个联系人,那么1s钟能够获取到1500+的联系人,在三星s3上面30ms能够获取到22个联系人,1s大约能够获取到700个联系人。所以这个结果还是能够接受的。

查取所有国家电话区号并构成一个数组。(从网上找到国家区号复制在txt文本,然后通过间断的java程序就能把他们格式化。)

int[] countryCode = new int[]{
            86, 93, 355, 213, 376,//中国,阿富汗,阿尔巴尼亚,阿尔及利亚,安道尔,
            244, 1264, 1268, 54, 374,//安哥拉,安圭拉岛(),安提瓜和巴布达,阿根廷,亚美尼亚,
            297, 247, 61, 43, 994,//阿鲁巴岛,阿森松(),澳大利亚,奥地利,阿塞拜疆,
            1242, 973, 880, 1246, 375,//巴哈马国,巴林,孟加拉国,巴巴多斯,白俄罗斯,
            32, 501, 229, 1441, 975,//比利时,伯利兹,贝宁,百慕大群岛(),不丹,
            591, 267, 55, 673, 359,//玻利维亚,博茨瓦纳,巴西,文莱,保加利亚,
            226, 257, 237, 1, 34,//布基纳法索,布隆迪,喀麦隆,加拿大,加那利群岛(西),
            238, 235, 236, 56, 1345,//佛得角,乍得,中非,智利,开曼群岛(),
            619164, 619162, 57, 1767, 269,//圣诞岛,科科斯岛,哥伦比亚,多米尼加联邦,科摩罗,
            242, 682, 506, 385, 53,//刚果,科克群岛(),哥斯达黎加,克罗地亚,古巴,
            357, 420, 45, 246, 298,//塞浦路斯,捷克,丹麦,迪戈加西亚,法罗群岛,
            299, 253, 1809, 593, 20,//格陵兰岛,吉布提,多米尼加共和国,厄瓜多尔,埃及,
            503, 240, 372, 251, 291,//萨尔瓦多,赤道几内亚,爱沙尼亚,埃塞俄比亚,厄立特里亚,
            500, 679, 358, 33, 594,//福克兰群岛,斐济,芬兰,法国,法属圭亚那,
            241, 220, 995, 49, 233,//加蓬,冈比亚,格鲁吉亚,德国,加纳,
            350, 30, 1473, 1671, 502,//直布罗陀(),希腊,格林纳达,关岛(),危地马拉,
            245, 590, 224, 592, 509,//几内亚比绍,瓜得罗普岛(),几内亚,圭亚那,海地,
            504, 36, 354, 353, 91,//洪都拉斯,匈牙利,冰岛,爱尔兰,印度,
            62, 98, 964, 972, 39,//印度尼西亚,伊朗,伊拉克,以色列,意大利,
            225, 1876, 81, 962, 855,//科特迪瓦,牙买加,日本,约旦,柬埔寨,
            7, 254, 996, 686, 850,//哈萨克斯坦,肯尼亚,吉尔吉斯斯坦,基里巴斯,朝鲜,
            965, 856, 371, 961, 266,//科威特,老挝,拉脱维亚,黎巴嫩,莱索托,
            231, 218, 4175, 370, 352,//利比里亚,利比亚,列支敦士登,立陶宛,卢森堡,
            261, 265, 60, 960, 223,//马达加斯加,马拉维,马来西亚,马尔代夫,马里,
            356, 1670, 692, 596, 230,//马耳他,马里亚纳群岛,马绍尔群岛,马提尼克(),毛里求斯,
            269, 222, 691, 52, 1808,//马约特岛,毛里塔尼亚,密克罗尼西亚,墨西哥,中途岛(),
            373, 377, 212, 258, 95,//摩尔多瓦,摩纳哥,摩洛哥,莫桑比克,缅甸,
            389, 976, 264, 674, 977,//马其顿共和国,蒙古,纳米比亚,瑙鲁,尼泊尔,
            31, 64, 505, 227, 234,//荷兰,新西兰,尼加拉瓜,尼日尔,尼日利亚,
            683, 672, 47, 968, 92,//纽埃岛(),诺福克岛(),挪威,阿曼,巴基斯坦,
            680, 507, 595, 51, 63,//帕劳,巴拿马,巴拉圭,秘鲁,菲律宾,
            48, 351, 35196, 35191, 1787,//波兰,葡萄牙,马德拉群岛(),亚速尔群岛(),波多黎各(),
            974, 262, 40, 7, 250,//卡塔尔,留尼旺岛(),罗马尼亚,俄罗斯,卢旺达,
            684, 685, 378, 966, 221,//东萨摩亚(),西萨摩亚,圣马力诺,沙特阿拉伯,塞内加尔,
            248, 232, 65, 421, 386,//塞舌尔,塞拉利昂,新加坡,斯洛伐克,斯洛文尼亚,
            677, 27, 252, 82, 34,//所罗门群岛(),南非,索马里,韩国,西班牙,
            94, 290, 1758, 1784, 249,//斯里兰卡,圣赫勒拿,圣卢西亚,圣文森特岛(),苏丹,
            597, 268, 46, 41, 963,//苏里南,斯威士兰,瑞典,瑞士,叙利亚,
            7, 255, 66, 228, 690,//塔吉克斯坦,坦桑尼亚,泰国,多哥,托克劳群岛(),
            676, 216, 90, 993, 688,//汤加,突尼斯,土耳其,土库曼斯坦,图瓦卢,
            256, 44, 380, 598, 1,//乌干达,英国,乌克兰,乌拉圭,美国(本土),
            1808, 907, 998, 678, 3906698,//夏威夷,阿拉斯加,乌兹别克斯坦,瓦努阿图,梵蒂冈,
            58, 84, 1284, 1340, 1808,//委内瑞拉,越南,维尔京群岛(),维京京群岛(),威克岛(),
            967, 381, 243, 260, 263,//也门,南斯拉夫,扎伊尔,赞比亚,津巴布韦,
            259, 969, 689, 675, 1681,//桑给巴尔,原民主也门地区,法属波里尼西亚,巴布亚新几内亚,瓦里斯和富士那群岛,
            852, 853, 239, 306, 971,//香港,澳门,圣多美和普林西比,(马尔维纳斯群岛),阿拉伯联合酋长国,
            689, 967, 387, 1649, 1868,//波利尼西亚,原阿拉伯也门地区,波斯尼亚和黑塞哥维那,特克斯和凯科斯群岛,特立尼达和多巴哥,
            508, 64672, 599, 687, 886,//圣皮埃尔岛及密克隆岛,南极,荷属安的列斯群岛,新喀里多尼亚群岛(),台湾,
            1664, 1869,//蒙特塞拉特岛(),圣克里斯托弗和尼维斯,
    };


    /*
    判断国家区号,忽略+
     */
    private boolean isCorrectCountryCode(final String code) {
        try {
            String copyCode = code;
            if (code.startsWith("+")) {
                //如果只有一个+号,明显地,相当于正确!
                			if(code.length() == 1){
                    return true;
                }
                copyCode = copyCode.substring(1);
            }
            int int_code = Integer.parseInt(copyCode);
            for (int i = 0; i < countryCode.length; i++) {
                if (int_code == countryCode[i]) {
                    return true;
                }
            }
        } catch (Exception e) {
            Log.d(TAG, e.toString());
        }
        return false;
    }
//查询避免由于区号引起拿不到联系人姓名的问题。(部分手机)
public String getContentUserName(String number) {
    Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[]{
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
    Log.d(TAG, "get All phone Name!");
    String getName = null;
    String getNumber = null;
    try{
        for (; cursor != null && cursor.moveToNext(); )
        {
            getName = cursor.getString(0);
            getNumber = cursor.getString(1);
            if (getNumber == null) {
                continue;
            }
            //  \\D的原因是部分手机在电话号码能够填写*#+-/等符号!
            getNumber = getNumber.replaceAll("[\\D]", "");
            Log.d(TAG, "raw name is " + getName + "   raw number is " + getNumber);
            //完全相等,优先级最高的情况。
            if (getNumber.equals(number)) {
                Log.d(TAG, "equals! get the Correct Data! name is " + getName);
                cursor.close();
                return getName;
            } else if (getNumber.endsWith(number)) {
                //如果存储的是+86+***,来电没有+86+***的情况。
                String code = getNumber.substring(0, getNumber.length() - number.length());
                Log.d(TAG, "getNumber.endsWith(number)! code is " + code);
                if (isCorrectCountryCode(code)) {
                    Log.d(TAG, "right! " + getName);
                    cursor.close();
                    return getName;
                }
            } else if (number.endsWith(getNumber)) {
                //如果储存的是没有+86+***,来电是+86+***的情况
                String code = getNumber.substring(0, number.length() - getNumber.length());
                Log.d(TAG, "number.endsWith(getNumber)! code is " + code);
                if (isCorrectCountryCode(code)) {
                    Log.d(TAG, "right! " + getName);
                    cursor.close();
                    return getName;
                }
            }
        }
    }catch (Exception e){
        Log.d(TAG,e.toString());
    }finally {
        try{
            cursor.close();
        }catch (Exception e){
            Log.d(TAG,e.toString());
        }
    }

    return number;
}
展开阅读全文

没有更多推荐了,返回首页