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, чтобы увидеть, какие группы определены для базы данных. Если вы не уверены в том, что оба телефона имеют одинаковые данные, вы обнаружите различия. Единственный способ убедиться, что они имеют точно такие же данные, - стереть с них данные контактов и синхронизировать их оба с небольшим набором тестовых данных.

Другие вопросы по тегам