4

連絡先の照合に関する OEM ダイヤラー アプリの動作のいくつかを再現しようとしてきましたが、うまくいきませんでした。基本的に、ほとんどの電話がそうであるように、ユーザーが電話番号と名前に対して入力されたエントリと一致するダイヤラーに番号を入力すると、潜在的な連絡先の一致のリストを作成したいと思います。たとえば、ダイヤラーに 323 と入力すると、(323)123-4567 などの NUMBER に 323 が含まれる連絡先や、Dad や Daffy などの DISPLAY_NAME を持つ連絡先と一致します。

ContactsContract.PhoneLookup.CONTENT_FILTER_URI は、書式設定を無視して電話番号を照合するために使用されることになっていることを知っています (したがって、5551234567 に対してその uri をクエリすると、番号が (555)123-4567 として保存されている連絡先が返されます)。問題は、これを部分的な数値で機能させることができないため、LIKE 句とワイルドカードを使用して選択引数を追加しても、5551 に対してクエリを実行すると同じ結果が含まれることです。他の URI のいずれかを使用すると、LIKE を含む選択引数は部分的な結果を返しますが、5551 が一致しないようにフォーマットが台無しになり、555)1 のみが一致します。 単一のクエリからの書式設定を無視して、部分的な数字の一致を取得する方法を誰か説明できますか? 複数のクエリを使用する他の試みは遅すぎて、ほとんどの電話で見られるエクスペリエンスを提供しないことが判明しました (Android ソースのストック ダイヤラーは連絡先の照合を行わず、検索のみを行うため、何の助けにもならないことに気付きました)。

第二に、物事の名前の部分については、私は実用的な解決策を持っていますが、それが最善の戦略であるかどうかはわかりません. ContactsContract.Contacts.CONTENT_FILTER_URI を使用することを望んでいました。これは、入力時に提案する結果をフィルタリングする方法であるとドキュメントに記載されているためですが、これも単一の部分的な名前のアルファ検索でのみ機能しますが、関連するキーパッド文字 (dad、dae、daf、ead、eae、eaf、fad など) のすべての組み合わせの部分一致を検索するには、323 を変換します。代わりに ContactsContract.CommonDataKinds.Phone.CONTENT_URI を選択引数とともに使用し、LIKE を使用してすべての可能性に一致させ、後続のリクエストで前のリクエストから返された連絡先 ID に基づいてフィールドを絞り込みました。 このタイプの数値パターン マッチングに ContactsContract.Contacts.CONTENT_FILTER_URI を活用する方法はありますか? 複数のリクエストに分割しようとしたことはありませんが、上記の部分的な番号の一致に似たようなことを試してみたときに経験したレイテンシに基づいて、うまく機能しないと思われます。

どんなアドバイスでも大歓迎です!

ありがとう、スコット

4

2 に答える 2

3

私はこれに2日間苦労してきましたが、最終的に私自身とスコットが望むように機能する解決策を得ました.

このURIを使用する必要があります

ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI を追加し、部分的な文字列 (名前または番号) である URI パスを追加します。

Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(partial));
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);

お役に立てれば!

于 2015-03-12T21:21:58.600 に答える
2

この手法は、次を使用して部分的な数値を解析するために機能します。

//encode the phone number and build the filter URI
Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.substring(len-9)));

String selection = PhoneLookup.NUMBER + " LIKE %" + number.substring(len-9) + "%";

Cursor cursor = context.getContentResolver().query(contactUri, projection, selection, null, null);

完全な例:

private void getContactDetails(String number) {
    // define the columns you want the query to return
    String[] projection = new String[] {
        PhoneLookup.DISPLAY_NAME,
        PhoneLookup._ID,
        PhoneLookup.LOOKUP_KEY};
    int len = number.length();
    // encode the phone number and build the filter URI
    Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.substring(len-9)));

    String selection = PhoneLookup.NUMBER + " LIKE %" + number.substring(len-9) + "%";

    Cursor cursor = context.getContentResolver().query(contactUri, projection, selection, null, null);

    if(cursor != null) {
        if (cursor.moveToFirst()) {
            String name = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            String lookUpKey = cursor.getString(cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY));
        }
        cursor.close();
    }
}

数字の最後の 10 桁を解析して一致させます。

于 2014-03-11T10:58:10.233 に答える