4

我一直在尝试复制一些有关联系人匹配的 OEM 拨号器应用程序行为,但运气不佳。基本上,我想填充一个潜在联系人匹配列表,因为用户在拨号器中键入与电话号码和姓名匹配的输入条目,就像大多数电话一样。例如,在拨号器中输入 323 将匹配 NUMBER 中任意位置具有 323 的联系人,例如 (323)123-4567 以及具有爸爸或 Daffy 的 DISPLAY_NAME 的联系人等。

我知道 ContactsContract.PhoneLookup.CONTENT_FILTER_URI 应该用于匹配电话号码而忽略格式(因此查询该 uri 针对 5551234567 将返回其号码存储为 (555)123-4567 的联系人)。问题是我无法让它与部分数字一起使用,因此即使我添加带有 LIKE 子句和通配符的选择参数,查询 5551 也会包含相同的结果。如果我使用任何其他 URI,带有 LIKE 的选择 arg 将返回部分结果,但格式会搞砸,因此 5551 不匹配,只有 555)1 匹配。 谁能解释我如何在忽略单个查询的格式时获得部分数字匹配? 其他使用多个查询的尝试被证明太慢了,并且不能提供我在大多数手机上看到的体验(我注意到 Android 源中的股票拨号器不进行联系人匹配,只进行搜索,所以没有帮助)。

其次,对于事物的名称部分,我有一个可行的解决方案,尽管我不确定这是最好的策略。我曾希望使用 ContactsContract.Contacts.CONTENT_FILTER_URI,因为文档说这是您应该如何过滤结果以获取键入建议的结果,但同样只适用于单个部分名称的 alpha 搜索,而我需要翻译 323 以搜索相关键盘字母(dad、dae、daf、ead、eae、eaf、fad 等)的所有组合的部分匹配。相反,我使用了 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 和选择参数,使用 LIKE 来匹配所有可能性,然后后续请求根据上一个请求返回的联系人 ID 缩小字段。 有没有办法利用 ContactsContract.Contacts.CONTENT_FILTER_URI 进行这种类型的数字模式匹配? 我没有尝试将其分解为多个请求,但根据我在尝试上述部分数字匹配时遇到的延迟,我怀疑它不会很好地工作。

非常感谢任何建议!

谢谢,斯科特

4

2 回答 2

3

我已经为此苦苦挣扎了 2 天,终于找到了一个可以满足我自己和 Scott 期望的解决方案。

您需要使用此 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 回答