12

着信 SMS から携帯電話番号を取得すると、国コードが追加されます。
データベース内の一致する連絡先には、私が使用している連絡先名を取得するための国コードが含まれていない可能性があるため:

public static String getContactName(String number, Context context) {

    try {

        Uri personUri = Uri.withAppendedPath(
            ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.trim()));
        String selection = PhoneLookup.NUMBER + " LIKE %" + number.trim() + "%";
        Cursor cur = context.getContentResolver().query(personUri,
            new String[] {
            PhoneLookup.DISPLAY_NAME
        },
            selection, null, null);
        if (cur.moveToFirst()) {
            String str = cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            cur.close();
            return str;
        }
    } catch (Exception e) {
        //e.printStackTrace();
        return number;
    }
    return number;
}

完全一致または部分一致を渡すと、これは完全に機能します。ただし、連絡先IDを取得したい場合は、次のコードを使用しています:

public static Contact getContact(String number, ContentResolver contentResolver) {

    Contact contact = new Contact(-1, number);
    try {
        Uri personUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(number));
        String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE '%" + number + "%'";
        Cursor cur = contentResolver.query(personUri,
            new String[] {
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID, PhoneLookup.DISPLAY_NAME
        },
            selection, null, null);
        if (cur.moveToFirst()) {
            contact = new Contact(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID))),
                cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME)));
        }
        cur.close();
    } catch (Exception e) {}
    return contact;
}

これは、数値が完全に一致する場合は完全に機能しますが、そうでない場合は何も返しません。番号が「01111111111」として保存され、着信番号が「+441111111111」である連絡先のIDを見つけるには、このメソッドが必要です。彼らは異なる URI を見ていますが、選択コードはほとんど同じであるため、なぜ 2 番目に機能しないのかわかりません。

何か案は?

4

8 に答える 8

10

同じ要件にこのコードを使用していますが、同じコードから contactId を返すことで名前を返します。これを使えば、あなたの問題は解決します。

public static String getContactDisplayNameByNumber(String number) {
    Uri uri = Uri.withAppendedPath(
            ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
            Uri.encode(number));
    String name = "?";

    ContentResolver contentResolver = context.getContentResolver();
    Cursor contactLookup = contentResolver.query(uri, new String[] {
            BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME },
            null, null, null);

    try {
        if (contactLookup != null && contactLookup.getCount() > 0) {
            contactLookup.moveToNext();
            name = contactLookup.getString(contactLookup
                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
            // String contactId =
            // contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID));
        }
    } finally {
        if (contactLookup != null) {
            contactLookup.close();
        }
    }

    return name;
}
于 2013-05-09T13:24:59.677 に答える
2

この種の問題については、Google 自身が Android フォン専用のライブラリを提供しています。奇妙なコードを使用しないでください。経験豊富な開発者によってテストされた Google の公式ライブラリをご覧ください。

国際電話番号の解析、フォーマット、保存、および検証を目的とした Googleのlibphonenumberライブラリを使用します。

このランディング ページには多くのコード スニペットがあるので、ここにコードを記述する必要はないと思います。そこから理解できるはずです。

http://code.google.com/p/libphonenumber/

彼らはすべてのリソースに How to parseHow to matchを与えました。

あなたに関連するこのライブラリの機能:

  • 世界のすべての国/地域の電話番号の解析/フォーマット/検証。

  • isNumberMatch - 2 つの数値が同じかどうかの信頼レベルを取得します。

  • findNumbers - テキスト入力で数字を検索します。

于 2013-05-09T13:43:44.033 に答える
0

おそらく、すべての国コードで静的変数(配列など)を使用し、2パスアプローチを使用してコードを正しく一致させることができます。国コードが追加されたり、何かが追加されたりした場合、この配列は更新によって更新されるか、本当にうまくいく必要がある場合は、オンラインの標準ソースからプルして、アプリから定期的な更新をトリガーします。

private static int countrycodes[]; // define the entire data here
...
{
...
for(int i=0;i<countrycodes.length;i++){
    //match using regexp or something and flag this for 2nd pass
    }
}
于 2013-05-07T20:11:52.183 に答える
0

これを試してください:電話番号を扱うための Google のライブラリ

于 2013-04-24T11:26:54.380 に答える
0

あなたの質問に正しく答えたかどうかはよくわかりませんが、次のように理解しています。電話番号が 2 つの異なる方法で表示されるという問題があります。国コードの有無にかかわらず。

2つの簡単な解決策があると思います。最も簡単な方法は、受信トレイからの読み取り入力を変更することです。受信トレイには、トリミング可能な国コードが常に含まれます。例えば

String inboxNo; //the number you've read from the inbox
int length = inboxNo.length     
if ((inboxNo.equals(whatYouAreSearching) || (String withOutCountryCode = "0"+ inboxNo.substring(3,length-1))
...

もう 1 つの解決策は、データベース エントリの最初の文字を確認して変換することです。例えば

if(!dataBaseNo.substring(0,1).contanins("+"){
dataBaseNo = "+44" + dataBaseNo.substring(1,length-1);
...
于 2013-05-07T12:41:05.930 に答える