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

编程入门 行业动态 更新时间:2024-10-25 06:28:44

Android通过来电号码识别<a href=https://www.elefans.com/category/jswz/34/1741779.html style=姓名。"/>

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

更多推荐

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

本文发布于:2023-06-29 10:52:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/943746.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:姓名   号码   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!