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;
}