匹配传入和传出的电话号码

时间:2011-01-25 17:33:03

标签: android sms contact country

我目前正在制作短信查看应用程序,并使用ContentResolver获取手机上的所有短信(是的,我了解风险)。与其他应用程序一样,我想将来自同一个人的所有消息分组到一个线程,显示来自它们的最新消息,并按照最后一条消息的日期对联系人进行排序。

当涉及传入消息的地址值时,它们都包含国家代码(例如+44123456789)。但是当用户保存他的联系人时,他可以忽略国家代码并只输入本地格式。因此,所有外发邮件都存储为0123456789。

因此,数据库将包含两种格式的相同地址,+ 44123456789和0123456789.您如何匹配此2并删除重复的地址?

注意: 1)来自同一个人的消息可能没有相同的“线程ID” 2)地址

可能没有“联系人ID”/“显示名称”值

2 个答案:

答案 0 :(得分:2)

实际上,来自同一个联系人的消息都在同一个线程中,因此它们具有相同的thread_id。 (除了多个收件人消息,这些消息都在他们自己的主题中)。

通过查看内容:// sms并存储获取的thread_ids列表,您可以确保没有重复项。使用地址值,您可以使用以下代码获取显示名称。

现在,我正在努力优化这个:

private String quickCallerId(String phoneNumber){
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    ContentResolver resolver=getContentResolver();
    Cursor cur = resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);
    if(cur!=null&&cur.moveToFirst()){
            String value=cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            if(value!=null){ 
                cur.close();
                return value;
            }
    }
    cur.close();
    return "";
}

答案 1 :(得分:0)

我没有代码,但是从右到左分析字符串非常容易。您可以这样做,只需设置一个任意限制,以确定它必须停止的准确程度。

例如(伪代码),给定2个字符串(string1和string2):

if first-char = '+'
  len = 9
else
  len = length(string1)
end
len = min(len, length(string2))
match = true
for i = len to 1
  if substr( string2, i, 1) != substr( string2, i, 1)
    match = false
    quit
  end
  i--
end

您可以通过检查“+”符号后面的字符来确定国家/地区代码,以便了解该国家/地区的电话号码可能会有多长时间。

您还需要检查输入数字的人员,例如'(123)456-7890 x1234'如果这是可能的话。因此,使用一些正则表达式变体可能更简单......