如何稳健地比较Android中的电话号码?

时间:2012-12-17 23:50:40

标签: android contacts android-contacts

在我正在开发的Android应用中,我有一个映射的数据库:

  

<联系人ID,联系人查询密钥> - > < 与联系人关联的我的自定义数据>

当收到传入的短信时,我希望能够查找与发送短信的联系人关联的与联系人关联的我的自定义数据。我想尽可能少地进行查找。

我可以从短信中获得的唯一数据是电话号码,因此问题基本上是将电话号码映射到我的自定义与联系人相关的数据尽可能少的步骤。

现在,我知道我可以使用ContactsContract.PhoneLookup查找电话号码中的联系人,例如: here。但是,这不能使我达到我想要的结果,因为联系人ID和联系人查找键都可能会发生变化。因此,如果ID或查找键已经更改为我持久保存到我的数据库的任何联系人,我必须基本上加载我的整个数据库并刷新每行的ID /查找键,然后我才能测试它们是否代表同一个联系人ContactsContract.PhoneLookup返回的那个。这是一个非常残酷的解决方案,我宁愿避免。

我想要做的是保留一个表格,将电话号码映射到我的自定义数据(以N:1的关系)。

  

<电话号码> - > < 与联系人关联的我的自定义数据>

这样,至少在理论上,我可以索引电话号码列,只需一步查找数据。但是,电话号码有多种格式。只有我可以创建给定电话号码的规范表示,我的解决方案才有效。我的计划是使用PhoneNumberUtils.getStrippedReversed来生成一个有效的可索引规范电话号码,但这在一个简单的案例中失败了,例如:

  

PhoneNumberUtils.getStrippedReversed(“+ 1(306)6656320”) - > 02365566031   PhoneNumberUtils.getStrippedReversed(“(306)6656320”) - > 0236556603

他们的号码不一样!

因此,通过冗长的解释,我的问题是:任何人都可以想到将电话号码转换为规范电话号码的方式,以便我可以对号码执行索引数据库查找/ em>,或者我上面描述的问题的任何其他解决方案?

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法和getStrippedReversed

public static String toCallerIDMinMatch (String phoneNumber)

* 颠倒顺序返回网络部分中最右边的MIN_MATCH(5)字符这可用于对存储getStrippedReversed()的列执行数据库查找如果phoneNumber返回null == null *

然后您的比较将为您提供所需的结果