0

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

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

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

注意:1)来自同一个人的消息可能没有相同的“线程ID” 2)地址可能没有“联系人ID”/“显示名称”值

4

2 回答 2

2

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

通过查看 content://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 "";
}
于 2011-02-02T15:08:47.310 回答
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”。所以使用一些正则表达式变体可能更简单......

罗里

于 2011-01-25T20:19:19.280 回答