什么是号码匹配,个人理解,即判断两组号码是否属于同一个号码。在实际使用过程中,接触到的号码会涉及到区号,国家编码以及IP号码等,这个时候就用到了号码匹配。两个内容不一样的号码,如+86***和17951***,是不是同一个号码。就需要软件判断是否同一个号码。手机里面涉及号码匹配的场景很多,打电话发短信都要用到。和前面的+86***和17951***两个号码所示,号码匹配是从后往前进行比较的,可以猜测一个标准号码的附加号码都是加在前面的。

根据匹配数据来源可以将号码匹配分为一下两种:
        1.同一个应用内的号码匹配:在一个应用内判断两个号码是否是同一个号码,根据结果将记录合并或者分开。典型场景如:通话记录是否合并,新发送或者新接收的短信是新建会话还是存入已知会话。
        2.同联系人应用进行号码匹配:一个应用去联系人数据库里面查询,获取号码的其他数据。一般每个涉及号码的应用都会有一个自己的数据库的表,用来存储号码上的信息。应用第一次收到号码都会查询联系人的数据库,获得这个号码的详细信息:如姓名等。典型的场景有:发短信和打电话时候输入了号码自动匹配上了号码对应的联系人姓名,一段文字里面的号码是否在当前手机中有。

在android原生系统上,大致可以根据前面介绍,将其号码匹配的实现方案分为两种:
        1.在数据库增加PHONE_NUMBERS_EQUAL方法,进行SQL级别的匹配查询,这个方法有三个参数,两个是号码,还有一个是否是严格匹配。查看2.3.5的android源码,这个严格匹配和泰国有关系……所以一般这个参数都是false,即不执行严格号码匹配。
        2.在构建数据库的查询语句上,进行号码匹配。一般这种情况都会进行号码的从后往前的截断,直接判断截断的数据是否相等。

号码匹配是后往前匹配的,如果后面连续N个数字相等的话,就认为是同一个号码。这里的N,即是N位号码匹配。google自带的两个号码匹配都是7位号码匹配。下面来根据实例进行讲解。先说说数据库上的PHONE_NUMBERS_EQUAL方法,直接去看telephonyprovider里面的一个方法:

    private long getSingleAddressId(String address) {
……
if (!isPhoneNumber) {
selectionArgs = new String[] { refinedAddress };
} else {
selection += " OR PHONE_NUMBERS_EQUAL(address, ?, " +
(mUseStrictPhoneNumberComparation ? 1 : 0) + ")";
selectionArgs = new String[] { refinedAddress, refinedAddress };
}

如代码所示,构建SQL语句时候直接使用了PHONE_NUMBERS_EQUAL方法,进行数据库级别的比较,这里的号码匹配位数是7位,在OldPhoneNumberUtils.cpp文件中,定义语句是static int MIN_MATCH = 7。另外这里还有一个严格模式:mUseStrictPhoneNumberComparation。关于严格模式可以直接去OldPhoneNumberUtils.cpp所在目录查看PHONE_NUMBERS_EQUAL方法实现。自己看了下严格模式仅仅和泰国有关系,意义不是很大,android本身也基本都是关闭的,大多数场景下都没有使用严格模式。

再说说构建数据库语句时候的号码匹配。这个号码匹配位数是在PhoneNumberUtils.java文件里面。定义代码如下:static final int MIN_MATCH = 7。查看PhoneNumberUtils.java的公有方法public static String toCallerIDMinMatch(String)在contact数据库里面的调用,就可以看到:联系人数据库在每次新增加一个号码的时候,都会增加一个字段,即后7位号码,用来帮助查询。在构建查询的SQL语句时候,也会调用public static String toCallerIDMinMatch(String)方法,截取查询号码的后7位。典型代码如下:

    public void buildPhoneLookupAndContactQuery(
SQLiteQueryBuilder qb, String normalizedNumber, String numberE164) {
String minMatch = PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber);
StringBuilder sb = new StringBuilder();
appendPhoneLookupTables(sb, minMatch, true);
qb.setTables(sb.toString()); sb = new StringBuilder();
appendPhoneLookupSelection(sb, normalizedNumber, numberE164);
qb.appendWhere(sb.toString());
}

到这里google原生的号码匹配基本介绍结束。原生的是7位号码匹配,考虑到我国固定电话长度是8位,手机号码长度是11位,7位一般是不够用的,各开发者可以根据自己的需要进行修改。

详解android的号码匹配的更多相关文章

  1. adb shell 命令详解,android

    http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...

  2. adb shell 命令详解,android, adb logcat

    http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...

  3. 详解Android首选项框架ListPreference

    详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...

  4. 详解android:scaleType属性

    详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262    http://juliaailse. ...

  5. 详解Android Activity---启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

  6. Android Binder IPC详解-Android学习之旅(96)

    linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...

  7. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

  8. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  9. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...

随机推荐

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. <转>如何利用socket进行HTTP访问

    原文:<转>如何利用socket进行HTTP访问 如何利用socket进行HTTP访问 平常我们要访问某个URL一般都是通过浏览器进行:提交一个URL请求后,浏览器将请求发向目标服务器或者 ...

  3. 【iOS】Xib的使用与File&#39;Owner总结

    一.XIB的适用范围 xib(也叫Nib)与storyboard一样是用来描写叙述界面的. storyboard描写叙述的是比較大型的,大范围.适合描写叙述界面跳转等. 二.XIB的使用 Xib是小范 ...

  4. atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o.....

    atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o..... 1. 安装配置 1 1.1. 下载  dwr.jar 1M 1 1.2. 配置注解方式..web.xml 1 2 ...

  5. JS解析DataSet.GetXML()方法产生的xml

    在实际的项目制作过程中,经常要采用ajax方式来进行,当然,这就免不了要进行数据交换.如果采用拼接字符串的方式来进行,不仅拼接的时候麻烦,而且在拆解的时候更加麻烦,一旦遇到特殊字符,那么就是灾难了.因 ...

  6. css3中webkit-box的用法(平分父元素)

    display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分.目前box- ...

  7. t_sql语句得到表中所有信息

    --得到所有数据库SELECT Name FROM Master..SysDatabases ORDER BY Name --得到某一数据库的所有表SELECT Name FROM MyPhotos. ...

  8. jQuery 1.9 移除了 $.browser 的替代方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

  9. EasyUi的快速开发框架

    基于EasyUi的快速开发框架   先看图,下边这个简单的增.删.改.查,如果自己写代码实现,这两个页需要多少行代码? 如果再有类似的增.删.改.查,又需要多少行代码? 我最近搞的这个快速开发框架中, ...

  10. 利用XCode来进行IOS的程序开发

    利用XCode来进行IOS的程序开发 本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换 ...