Android 查询Contacts contract.Contacts.CONTENT_FILTER_URI不';不要考虑所有的联系人

Android 查询Contacts contract.Contacts.CONTENT_FILTER_URI不';不要考虑所有的联系人,android,android-contacts,Android,Android Contacts,我正在开发一个消息传递应用程序,需要一个具有“键入时搜索”功能的联系人列表。 我使用Contacts.CONTENT\u URI获取所有联系人的列表,并使用Contacts.CONTENT\u FILTER\u URI获取按姓名筛选的列表。 一切似乎都很好,直到一些测试人员报告说,他们无法使用搜索功能找到他们的一些联系人,但可以在查看整个列表时看到他们。如上所述,在这些情况下使用不同的URI 下面是对contacts ContentProvider执行查询的代码: private Cursor

我正在开发一个消息传递应用程序,需要一个具有“键入时搜索”功能的联系人列表。
我使用Contacts.CONTENT\u URI获取所有联系人的列表,并使用Contacts.CONTENT\u FILTER\u URI获取按姓名筛选的列表。
一切似乎都很好,直到一些测试人员报告说,他们无法使用搜索功能找到他们的一些联系人,但可以在查看整个列表时看到他们。如上所述,在这些情况下使用不同的URI

下面是对contacts ContentProvider执行查询的代码:

private Cursor getContactsCursorByQuery(ContactsQuery query) {
        String orderBy = null;
        if (query != null) {
            switch (query.getSortOrder()) {
                case NAME_ASCENDING: {
                    orderBy = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " COLLATE NOCASE ASC";
                    break;
                }
                case NAME_DESCENDING: {
                    orderBy = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE DESC";
                    break;
                }
                default: {
                    LOG.warn("Unsupported sort order " + query.getSortOrder());
                }
            }
        }

        ContentResolver contentResolver = CONTENT_RESOLVER;
        Cursor cur;
        Uri uri;
        if (query != null && !TextUtils.isEmpty(query.getName())) {
            // In search mode
            uri = ContactsContract.Contacts.CONTENT_FILTER_URI.buildUpon()
                    .appendEncodedPath(Uri.encode(query.getName()))
                    .build();
        } else {
            uri = ContactsContract.Contacts.CONTENT_URI;
        }
        cur = contentResolver.query(uri,
                CONTACTS_LIST_PROJECTION,
                null,
                null,
                orderBy);
        LOG.debug("Got cursor by query " + (query != null ? query.toString() : "{}"));
        return cur;
    }
为了找出我做错了什么,我研究了AOSP中contacts应用程序的源代码,找到了ContactsContract.Directory的引用。经过进一步调查,我最终得到了这样的解决方案:
-查询每个目录的内容\u过滤器\u URI;
-合并结果游标,并使用稍加修改的解决方案对其进行排序

private Cursor getContactsCursorByQuery(ContactsQuery查询){
字符串orderBy=null;
if(查询!=null){
开关(query.getSortOrder()){
案例名称\u升序:{
orderBy=Contacts contract.Contacts.DISPLAY_NAME_PRIMARY+“COLLATE NOCASE ASC”;
打破
}
案例名称(u):{
orderBy=Contacts contract.Contacts.DISPLAY_NAME+“COLLATE NOCASE DESC”;
打破
}
默认值:{
LOG.warn(“不支持的排序顺序”+query.getSortOrder());
}
}
}
ContentResolver ContentResolver=CONTENT\u解析器;
光标电流;
Uri;
if(query!=null&&!TextUtils.isEmpty(query.getName()){
//在搜索模式下
uri=ContactsContract.Contacts.CONTENT\u FILTER\u uri.buildon()
.appendEncodedPath(Uri.encode(query.getName()))
.build();
Directory[]directories=getDirectories();
LOG.debug(“联系人目录:”+Arrays.toString(目录));
列表游标=新的ArrayList();
对于(int i=0;i

但,不幸的是,这个问题仍然存在,我离开时不知道如何解决它。我需要你的帮助。提前感谢。

很抱歉问题标题含糊不清。刚刚编辑过。正如您从代码片段中看到的,我使用的正是Contacts contract.Contacts。
private Cursor getContactsCursorByQuery(ContactsQuery query) {
        String orderBy = null;
        if (query != null) {
            switch (query.getSortOrder()) {
                case NAME_ASCENDING: {
                    orderBy = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " COLLATE NOCASE ASC";
                    break;
                }
                case NAME_DESCENDING: {
                    orderBy = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE DESC";
                    break;
                }
                default: {
                    LOG.warn("Unsupported sort order " + query.getSortOrder());
                }
            }
        }

        ContentResolver contentResolver = CONTENT_RESOLVER;
        Cursor cur;
        Uri uri;
        if (query != null && !TextUtils.isEmpty(query.getName())) {
            // In search mode
            uri = ContactsContract.Contacts.CONTENT_FILTER_URI.buildUpon()
                    .appendEncodedPath(Uri.encode(query.getName()))
                    .build();
            Directory[] directories = getDirectories();
            LOG.debug("Contacts directories: " + Arrays.toString(directories));
            List<Cursor> cursors = new ArrayList<Cursor>();
            for (int i = 0; i < directories.length; i++) {
                if (directories[i].getId() != ContactsContract.Directory.LOCAL_INVISIBLE) {
                    Uri queryUri = uri.buildUpon()
                            .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
                                    String.valueOf(directories[i].getId()))
                            .build();
                    LOG.debug("Contacts of directory Uri: " + queryUri.toString());
                    Cursor tempCur;
                    tempCur = contentResolver.query(queryUri,
                            CONTACTS_LIST_PROJECTION,
                            null,
                            null,
                            orderBy);
                    if (tempCur != null) {
                        cursors.add(tempCur);
                    }
                }
            }
            Cursor[] cursorArray = new Cursor[cursors.size()];
            cursors.toArray(cursorArray);
            cur = new ContactsSortCursor(cursorArray, query.getSortOrder());
        } else {
            uri = ContactsContract.Contacts.CONTENT_URI;
            cur = contentResolver.query(uri,
                    CONTACTS_LIST_PROJECTION,
                    null,
                    null,
                    orderBy);
        }
        LOG.debug("Got cursor by query " + (query != null ? query.toString() : "{}"));
        return cur;
    }