什么是号码匹配,个人理解,即判断两组号码是否属于同一个号码。在实际使用过程中,接触到的号码会涉及到区号,国家编码以及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. dom01

    事件冒泡:即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的那个节点(文档). 事件捕获:即不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件. ...

  2. SQL点滴4—筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息

    原文:SQL点滴4-筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息 项目需要将Access数据库中的数据导入到SQL Server中,需要检验导入后的数据完整性,数据值是否正确.我们 ...

  3. AngularJS+requireJS项目的目录结构设想

    AngularJS+requireJS项目的目录结构设想 准备用AngularJS + require.js 作为新项目的底层框架,以下目录结果只是一个初步设想: /default    放页面,不过 ...

  4. 第三方控件netadvantage UltraWebGrid总结

    1.个人习惯前台绑定好实体字段,禁止自动生成:一些属性设置:AutoGenerateColumns="false" <igtbl:UltraWebGrid ID=" ...

  5. win8安装tfs2010提示未启用iis6.0未启用兼容模式需要静态内容组件

    笔者的电脑由于安装TFS2010就提示这个错误,当时网上也没有很好地办法,重装iis组件也不行.如果你同样没有找到更好的办法,建议安装tfs2012,但在vs2010使用tfs2012是无法创建团队项 ...

  6. ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

    一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript . 前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaS ...

  7. Mvc快速开发

    Asp.Net Mvc + ComBoost.Mvc快速开发   ComBoost项目地址 http://comboost.wodsoft.com https://github.com/Kation/ ...

  8. Enumerable和yield

    说说IEnumerable和yield IEnumerable数据类型是我比较喜欢的数据类型,特别是其强类型IEnumerable<T>更获得Linq的支持使得代码看起来更加优雅.整洁. ...

  9. WPF开发的FTP文件上传工具

    前言 最近楼主在改版的项目里有使用到FTP上传文件,所以看到之前的项目里FTP上传的功能,然后抽个时间学习一番,做着做着就作出了这个工具了(虽然有些验证的功能没加上),但是基本的上传功能还是很好用的, ...

  10. Definition of:payload

    (1) Refers to the "actual data" in a packet or file minus all headers attached for transpo ...