现在的位置: 首页 > 综合 > 正文

Android号码匹配长度分析

2018年04月21日 ⁄ 综合 ⁄ 共 1270字 ⁄ 字号 评论关闭

 (一)  前言
在手机联系人匹配时经常会遇到这样一个问题:
比如我手机中存入的联系人是A,号码 1234567 ; 嗯,那么当07551234567这么一个电话进来的时候,我们肯定要通过07551234567这个号码找到A这个联系人。
所以这里面的匹配过程肯定不是简单而粗暴的字符串比较过程,而是有一个设计在里面,ok,那么我们今天就来分析这个设计。

(二)  设计思想
首先我们要明白一点,就是我们的匹配都是从后往前计算的。
为了解决这个问题,Google给出了一个最小匹配(min match)两个概念,嗯, 嘛意思呢。。?
1.  min match, 最小匹配,就是说让号码从后往前数最小匹配数,这几个数必须相同,才认为最小匹配成功。
比如我们设置min match=7,两个号码1234567和07551234567,我们从后往前数7位,也就是7654321,我们会发现这两个号码从后往前数7位都是7654321,所以,这两个号码通过了最小匹配。
举个反面例子,如果两个号码0234567和07551234567,那么从后往前数7位,第一个号码是0234567,第二个号码是1234567,不相同,嗯,Android系统则认为这两个号码不是一个号码了。
抑或234567和07551234567,这两个号码同样不是一个号码。原因相信各位聪明的午饭自己一算便知道了。


(三)  代码位置
ok..上面讲了这么多,那么我们Android系统里面对应的代码在哪里呢?
1.  在/frameworks/base/telephony/java/android/telephony/PhoneNumberUtils.java里面有个 MIN_MATCH 成员变量,可以用来控制min match
2.  在源代码/external/sqlite/android/OldPhoneNumberUtils.cpp文件里面有个 MIN_MATCH, 也是用来控制最小匹配的,这个值和第1点的值最好设置成一样。
3.  在ContactsProvider下面有个contacts.db,里面有张表 phone_lookup,这张表包含4个字段
    a.  data_id  在data表中对应的记录行
    b.  raw_contact_id  表示这行记录对应的联系人
    c.  normalized_number  表示这个联系人的电话号码,那么由于一个联系人是可以有多个号码的,所以就会出现多行一行的raw_contact_id
    d.  min_match  最小匹配长度,这列记录是系统根据设置的min_match值从联系人表中找到电话号码,再把电话号码后面最小匹配长度截取出来的。如果电话号码不足最小匹配长度,那就有多长截多长。
         比如最小匹配是7, 电话号码01234567,截取之后就会得到7654321;那如果电话号码是123,那么截取之后就是321了。。

嗯, 也差不多是这么多了,如果大家涉及到这块,就知道找到对应的文件,修改min_match值就可以啦!
一点浅见,仅供抛砖引玉而已~

抱歉!评论已关闭.