我正在开发一个消息传递应用程序,需要一个具有搜索功能的联系人列表。
我使用Contacts.CONTENT_URI获取所有联系人列表和Contacts.CONTENT_FILTER_URI以获取按名称过滤的列表。
一切似乎工作正常,直到一些测试人员报告他们无法使用搜索功能找到他们的一些联系人,但在查看整个列表时可以看到他们。正如我上面提到的,在这些情况下使用了不同的URI。
以下是对联系人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的联系人申请来源,并找到了对ContactsContract.Directory的引用。经过一些进一步的调查,我得到了这样的解决方案:
- 查询每个目录的CONTENT_FILTER_URI;
- 合并结果游标并使用稍微修改过的解决方案对此question;
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;
}
但是,不幸的是,问题仍然存在,我不知道如何修复它。需要你的帮助。提前谢谢。