项目中遇到需要通过来电号码获取到联系人姓名的需求。
然而,简单地通过联系人数据库的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,//塞浦路斯,捷克,丹麦,迪戈加西亚,