Это немного грубо, но у меня работает.Я не мог найти простой способ поиска контактов ни в одной группе без выполнения двух запросов.
Вероятно, вы можете оптимизировать запрос для удаления дубликатов, что устраняет необходимость в наборе 'foundIds'.
private Cursor getNoGroupsCursor() {
Set<String> groupIds = new HashSet<String>();
Set<String> foundIds = new HashSet<String>();
// Get the group membership
Cursor gmCursor = getContentResolver().query(
Data.CONTENT_URI,
new String[] { Data.CONTACT_ID, Data.MIMETYPE, Data.DATA1 },
Data.MIMETYPE + " = '" + GroupMembership.CONTENT_ITEM_TYPE
+ "'", null, null);
while (gmCursor.moveToNext()) {
String groupTitle = gmCursor.getString(2);
// We need to pre-parse the group ids to find all the ones that
// have a group
if (groupTitle != null && !"-1".equals(groupTitle)) {
groupIds.add(gmCursor.getString(0));
}
}
gmCursor.close();
// Get the contacts
gmCursor = getContentResolver().query(Data.CONTENT_URI,
new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME }, null,
null, "2 ASC");
// We want a projected matrix cursor that contains the contact ID and
// group name, rather than the group ID
MatrixCursor mc = new MatrixCursor(PROJECTION_GROUPS);
while (gmCursor.moveToNext()) {
String id = gmCursor.getString(0);
if (!foundIds.contains(id) && !groupIds.contains(id)) {
mc.addRow(new Object[] { gmCursor.getString(0),
gmCursor.getString(1), null, null });
foundIds.add(id);
}
}
gmCursor.close();
return mc;
}