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

В настоящее время я делаю приложение для просмотра SMS и использую ContentResolver для получения всех SMS-сообщений на телефоне (да, я понимаю риски). Как и другие приложения, я хочу сгруппировать все сообщения от одного и того же человека в одну ветку, отобразить последнее сообщение от них и упорядочить контакты по дате последнего сообщения.

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

Таким образом, база данных будет содержать один и тот же адрес в обоих форматах: +44123456789 и 0123456789. Как сопоставить эти 2 и удалить повторяющийся адрес?

Примечание. 1) Сообщения от одного и того же человека могут не иметь одного и того же «идентификатора темы». 2) Для адреса может не быть значения «идентификатор контакта»/«отображаемое имя».


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


Ответы (2)


На самом деле сообщения от одного и того же контакта находятся в одной и той же ветке, поэтому у них один и тот же thread_id. (Кроме нескольких сообщений получателей, которые находятся в отдельной ветке).

Заглянув в content://sms и сохранив список полученных thread_id, вы можете убедиться, что нет дубликатов. Со значением адреса вы можете использовать следующий код для получения отображаемого имени.

Теперь я пытаюсь оптимизировать это:

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 строки (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», если это возможно. Так что может быть проще использовать какой-то вариант регулярного выражения...

Рори

person roryhewitt    schedule 25.01.2011
comment
Да, метод PhoneNumberUtils.compare(String, String) на самом деле делает то, что вы сказали. Но сравнивать весь список существующих адресов для каждой прочитанной смс - это слишком дорого... - person KeniF; 26.01.2011
comment
Ну дорого - вещь относительная. Возможно, пользователь может указать, насколько «точным» он хочет быть? - person roryhewitt; 26.01.2011