android ContactsContract.CommonDataKinds.GroupMembership и ICS
Мне нужно выяснить, является ли конкретный контакт членом данной группы. Я работал с приведенным ниже кодом и доказал, что он работает на телефоне с Gingerbread. Однако я пытался запустить его на своем HTC One S под управлением Android версии 4.0.3, и он не работает. Изменилась ли спецификация API? Мой код ниже.
public boolean checkGroupMembership(String groupID, String contactID, Context ctx) {
ContentResolver groupContentResolver = ctx.getContentResolver();
String select = "contact_id=" + contactID +
" AND " + GroupMembership.GROUP_ROW_ID + " = " + groupID +
" AND mimetype='vnd.android.cursor.item/group_membership'";
Cursor contactGroupCursor =
groupContentResolver.query(
Data.CONTENT_URI,
new String[] { GroupMembership.CONTACT_ID, GroupMembership.GROUP_ROW_ID, GroupMembership.IN_VISIBLE_GROUP },
select,
null,
null);
int records = contactGroupCursor.getCount();
try {
while(contactGroupCursor.moveToNext()){
String ContactID = contactGroupCursor.getString(contactGroupCursor.getColumnIndexOrThrow(GroupMembership.CONTACT_ID));
String groupRowId = contactGroupCursor.getString(contactGroupCursor.getColumnIndexOrThrow(GroupMembership.GROUP_ROW_ID));
String InVisiblegroup = contactGroupCursor.getString(contactGroupCursor.getColumnIndexOrThrow(GroupMembership.IN_VISIBLE_GROUP));
Log.d("DEBUG", "groupSourceId in checkGroupMembership: " + groupRowId + " InVisiblegroup = " + InVisiblegroup);
Log.d("DEBUG", "ContactID in checkGroupMembership: " + ContactID);
}
}
finally
{
contactGroupCursor.close();
}
// see if the contact is in this group
if (records > 0) {
return true;
}
else {
return false;
}
}
}
Кроме того, изменив запрос, чтобы просто выяснить, к каким группам относится контакт:
String select = "contact_id=" + contactID;
приводит к следующему выводу отладки. В некоторых случаях groupRowID выглядит как идентификатор группы, в других это номер контакта или имя контакта. Обратите внимание, что я использую мой домашний стационарный телефон для вызова теста, и это появляется. Кроме того - у меня только 10 групп, определенных на телефонной трубке, и идентификатор 11, 12 и 13 напечатан в выводе... Может быть, я что-то упустил? Я точно знаю, что contact_id, который я передаю, является членом группы Coworkers (group_ID 5 на моем телефоне), но это никогда не возвращается в ICS. Я самостоятельно проверил членство в группе для HOME, используя приложения диспетчера контактов на обеих телефонах.
11-04 11: 48: 21.980: D / DEBUG (10145): выберите в checkGroupMembership: contact_id=133 11-04 11:48:21.990: D/DEBUG(10145): количество записей в checkGroupMembership: 13 11-04 11:48:22.000: D/DEBUG(10145): groupRowId в checkGroupMembership: null InVisiblegroup = 1 11-04 11:48:22.000: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.000: D/DEBUG(10145): groupRowId в checkGroupMembership: InVisiblegroup = 1 11-04 11:48:22.000: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.000: D/DEBUG(10145): groupRowId в checkGroupMembership: 004-414-83326995 InVisiblegroup = 1 11-04 11:48:22.000: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.000: D/DEBUG(10145): groupRowId в checkGroupMembership: 014-833-26995 InVisiblegroup = 1 11-04 11:48:22.000: D/MYOB(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/MYOB(10145): groupRowId в checkGroupMembership: 01483326995 InVisiblegroup = 1 11-04 11:48:22.030: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 10 InVisiblegroup = 1 11-04 11:48:22.030: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 11 InVisiblegroup = 1 11-04 11:48:22.030: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 12 InVisiblegroup = 1 11-04 11:48:22.030: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 13 InVisiblegroup = 1 11-04 11:48:22.030: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 7 InVisiblegroup = 1 11-04 11:48:22.030: D/DEBUG(10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 8 InVisiblegroup = 1 11-04 11: 48: 22.030: D / ОТЛАДКА (10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: 9 InVisiblegroup = 1 11-04 11: 48: 22.030: D / DEBUG (10145): ContactID в checkGroupMembership: 133 11-04 11:48:22.030: D/DEBUG(10145): groupRowId в checkGroupMembership: HOME InVisiblegroup = 1 11-04 11: 48: 22.030: D / DEBUG (10145): ContactID в checkGroupMembership: 133
PS пожалуйста, может кто-то с достаточными привилегиями добавить "GroupMembership" в качестве тега на сайт.
2 ответа
На изображении ниже показан дамп групп из Gingerbread (Cyanogen) и ICS (HTC), созданных с использованием одного и того же кода. Как вы можете видеть, они совершенно разные с точки зрения представления данных. По некоторым причинам группы дублируются в некоторой степени в ICS. Поэтому вопрос заключается в том, как мне управлять этим в разных версиях, если я планирую использовать группу _ID для выполнения поиска. Обратите внимание, что в приложении контактов в ICS каждая группа появляется только один раз, так как мне узнать, к какому идентификатору это относится?
Ничего не изменилось в членстве в группах между Honeycomb и 4.0.3.
Было бы легче прочитать все это, если вы использовали LogCat или даже сделали ListView и снимок экрана или что-то еще. Трудно понять, в чем твоя проблема. Вы можете сделать дамп ContactsContract.Groups, чтобы увидеть, какие группы определены для базы данных. Если вы не уверены в том, что оба телефона имеют одинаковые данные, вы обнаружите различия. Единственный способ убедиться, что они имеют точно такие же данные, - стереть с них данные контактов и синхронизировать их оба с небольшим набором тестовых данных.