详解android的号码匹配
什么是号码匹配,个人理解,即判断两组号码是否属于同一个号码。在实际使用过程中,接触到的号码会涉及到区号,国家编码以及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的号码匹配的更多相关文章
- adb shell 命令详解,android
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
- adb shell 命令详解,android, adb logcat
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- 详解android:scaleType属性
详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262 http://juliaailse. ...
- 详解Android Activity---启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- 图文详解 Android Binder跨进程通信机制 原理
图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...
随机推荐
- HTML5 五彩圆环Loading加载动画实现教程
原文:HTML5 五彩圆环Loading加载动画实现教程 今天我们要来介绍一款效果很特别的HTML5 Loading加载动画,不像其他的Loading动画,这款Loading动画颜色很丰富,并且在转圈 ...
- linux下编译安装mysql5.5以上版本
安装cmake: tar zxvf cmake-2.8.4.tar.gz cd cmake-2.8.4 ./configure --prefix=/usr/local/cmake make & ...
- 原生JavaScript生成GUID的实现
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- String 的intern() 方法说明
1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...
- 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip
原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...
- 值为NULL的对象指针
相信大家对NULL不会很陌生,NULL 是一个标准规定的宏定义,用来表示空指针常量,当一个指针变量被赋值为NULL时,表示它不再指向任何有效地址,无法在访问任何数据.在VS2012库文件stdio.h ...
- 【转】android json解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- 在PHP中如何连接到数据库
首先我们先运行WampServer中的phpMyAdmin随即弹出phpMyAdmin页面 在弹出的页面中左边是数据库列表 右边是相应的设置 选择一个数据库 在里面创建一张数据表 注意创建数 ...
- 微信SDK使用总结
最近做一个分享功能,需要使用微信SDK分享内容给朋友或朋友圈.期间遇到些奇怪的问题,花了点时间去折腾了一番. 首先需要到微信开放平台http://open.weixin.qq.com/?lang=zh ...
- Akka入门实例
Akka入门实例 Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. Actor模型并非什么新鲜事物,它由Carl Hew ...