0

私は現在、SMS表示アプリケーションを作成しており、ContentResolverを使用して電話ですべてのSMSメッセージを取得しています(はい、リスクを理解しています)。他のアプリケーションと同様に、同じ人からのすべてのメッセージを1つのスレッドにグループ化し、それらからの最新のメッセージを表示し、最後のメッセージの日付順に連絡先を並べ替えます。

受信メッセージのアドレス値に関しては、すべての国コードが含まれています(例:+44123456789)。ただし、ユーザーが連絡先を保存するときは、国コードを無視して、ローカル形式で入力するだけで済みます。したがって、すべての送信メッセージは0123456789として保存されます。

したがって、データベースには、+ 44123456789と0123456789の両方の形式で同じアドレスが含まれます。この2つをどのように照合し、重複するアドレスを削除しますか?

注:1)同じ人からのメッセージは同じ「スレッドID」を持っていない可能性があります2)アドレスの「連絡先ID」/「表示名」の値がない可能性があります

4

2 に答える 2

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 "";
}
于 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-7890x1234」などの番号を入力している人を確認する必要があります。したがって、正規表現のバリアントを使用する方が簡単かもしれません...

ロリー

于 2011-01-25T20:19:19.280 に答える