Съпоставяне на входящи и изходящи телефонни номера

В момента правя приложение за преглед на SMS и използвам ContentResolver, за да получа всички SMS съобщения на телефона (Да, разбирам рисковете). Подобно на други приложения, искам да групирам всички съобщения от едно и също лице в една нишка, да покажа последното съобщение от него и да подредя контактите по дата на последното съобщение.

Когато става въпрос за адресните стойности на входящите съобщения, всички те съдържат кода на държавата (напр. +44123456789). Но когато потребителят запази своите контакти, той може да игнорира кода на държавата и просто да въведе местния формат. Така че всички изходящи съобщения се съхраняват като 0123456789.

И така, базата данни ще съдържа един и същ адрес и в двата формата, +44123456789 и 0123456789. Как да съпоставите тези 2 и да премахнете дублиращия се адрес?

Забележка: 1) Съобщенията от едно и също лице може да нямат същия „идентификационен номер на нишка“ 2) Възможно е да няма стойност „идентификационен номер на контакт“/„показвано име“ за адреса


person KeniF    schedule 25.01.2011    source източник


Отговори (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 "";
}
person KeniF    schedule 02.02.2011

Нямам кода при себе си, но е доста лесно да анализирам низ отдясно наляво. Можете да направите това и просто да зададете произволно ограничение за това колко точно трябва да бъде спирането.

Например (псевдокод), дадени 2 низа (низ1 и низ2):

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“, ако това е възможност. Така че може да е по-лесно да се използва някакъв вариант на регулярен израз...

Рори

person roryhewitt    schedule 25.01.2011
comment
Да, методът PhoneNumberUtils.compare(String, String) всъщност прави това, което казахте. Но сравняването на целия списък от съществуващи адреси за всеки SMS, който четете, е твърде скъпо... - person KeniF; 26.01.2011
comment
Е, скъпото е относително нещо. Може би потребителска опция да посочи колко „точна“ иска да бъде? - person roryhewitt; 26.01.2011