使用部分数据查询联系人

我一直在尝试复制一些有关联系人匹配的OEM拨号器应用行为,但没有多少运气。 基本上,我想填充一个潜在的联系人匹配列表,因为用户在拨号程序中键入数字,与大多数电话所使用的类型匹配的电话号码和姓名匹配。 例如,在拨号程序中键入323可以匹配NUMBER中任意位置有323个的联系人,如(323)123-4567以及与DAD或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,因为文档说这是你应该如何筛选结果以获得即时类型的建议,但是这又只适用于单个部分名称的字母搜索,而我需要翻译323以针对关联的小键盘字母(dad,dae,daf,ead,eae,eaf,fad等)的所有组合的部分匹配进行搜索。 我使用了ContactsContract.CommonDataKinds.Phone.CONTENT_URI,其中使用LIKE的选择参数与所有可能性进行匹配,然后后续请求根据从先前请求返回的联系人ID缩小字段。 有没有办法利用ContactsContract.Contacts.CONTENT_FILTER_URI来进行这种类型的数字模式匹配? 我没有尝试将其分解为多个请求,但基于我尝试类似于上述部分数字匹配的延迟,我怀疑它不能很好地工作。

任何意见非常感谢!

谢谢,斯科特


我一直在为此挣扎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);

希望这可以帮助!


这种技术适用于我,解析部分数字,使用:

//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位数字,希望它会有所帮助!

链接地址: http://www.djcxy.com/p/31983.html

上一篇: Querying Contacts with Partial Data

下一篇: Fetch Contacts in android application