android ContactsContract.CommonDataKinds.GroupMembership和ICS

时间:2012-11-04 12:30:42

标签: android android-4.0-ice-cream-sandwich group-membership

我需要查明特定联系人是否是特定组的成员。我一直在使用下面的代码,并证明它可以使用运行Gingerbread的手机。但是我一直试图在运行Android 4.0.3版本的HTC One S上运行它并且它失败了。 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看起来像一个组ID,在其他情况下,它是联系人号码或联系人的姓名。请注意,我正在使用我的家庭座机呼叫测试,这正在出现。另外 - 我手机上只定义了10组,输出中印有11,12和13的ID ......可能是我错过了什么?我肯定知道我传入的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):   checkGroupMembership中的groupRowId:null InVisiblegroup = 1 11-04   11:48:22.000:D / DEBUG(10145):checkGroupMembership中的ContactID:133   11-04 11:48:22.000:D / DEBUG(10145):groupRowId in   checkGroupMembership:InVisiblegroup = 1 11-04 11:48:22.000:   D / DEBUG(10145):checkGroupMembership中的ContactID:133 11-04   11:48:22.000:D / DEBUG(10145):checkGroupMembership中的groupRowId:   004-414-83326995 InVisiblegroup = 1 11-04 11:48:22.000:   D / DEBUG(10145):checkGroupMembership中的ContactID:133 11-04   11:48:22.000:D / DEBUG(10145):checkGroupMembership中的groupRowId:   014-833-26995 InVisiblegroup = 1 11-04 11:48:22.000:D / MYOB(10145):   checkGroupMembership中的ContactID:133 11-04 11:48:22.030:   D / MYOB(10145):checkGroupMembership中的groupRowId:01483326995   InVisiblegroup = 1 11-04 11:48:22.030:D / DEBUG(10145):ContactID in   checkGroupMembership:133 11-04 11:48:22.030:D / DEBUG(10145):   checkGroupMembership中的groupRowId:10 InVisiblegroup = 1 11-04   11:48:22.030:D / DEBUG(10145):checkGroupMembership中的ContactID:133   11-04 11:48:22.030:D / DEBUG(10145):groupRowId in   checkGroupMembership:11 InVisiblegroup = 1 11-04 11:48:22.030:   D / DEBUG(10145):checkGroupMembership中的ContactID:133 11-04   11:48:22.030:D / DEBUG(10145):checkGroupMembership中的groupRowId:12   InVisiblegroup = 1 11-04 11:48:22.030:D / DEBUG(10145):ContactID in   checkGroupMembership:133 11-04 11:48:22.030:D / DEBUG(10145):   checkGroupMembership中的groupRowId:13 InVisiblegroup = 1 11-04   11:48:22.030:D / DEBUG(10145):checkGroupMembership中的ContactID:133   11-04 11:48:22.030:D / DEBUG(10145):groupRowId in   checkGroupMembership:7 InVisiblegroup = 1 11-04 11:48:22.030:   D / DEBUG(10145):checkGroupMembership中的ContactID:133 11-04   11:48:22.030:D / DEBUG(10145):checkGroupMembership中的groupRowId:8   InVisiblegroup = 1 11-04 11:48:22.030:D / DEBUG(10145):ContactID in   checkGroupMembership:133 11-04 11:48:22.030:D / DEBUG(10145):   checkGroupMembership中的groupRowId:9 InVisiblegroup = 1 11-04   11:48:22.030:D / DEBUG(10145):checkGroupMembership中的ContactID:133   11-04 11:48:22.030:D / DEBUG(10145):groupRowId in   checkGroupMembership:HOME InVisiblegroup = 1 11-04 11:48:22.030:   D / DEBUG(10145):checkGroupMembership中的ContactID:133

P.S。请有足够权限的人请将“GroupMembership”添加为网站标记。

2 个答案:

答案 0 :(得分:0)

Honeycomb和4.0.3之间的小组成员资格没有任何变化。

如果您使用LogCat甚至是ListView和屏幕截图等,那么阅读所有这些会更容易。很难理解你的问题是什么。你可以做转储 ContactsContract.Groups以查看为数据库定义的组。除非您绝对确定这两款手机的完全相同的数据,否则您将发现差异。确保它们具有完全相同数据的唯一方法是从它们擦除联系人数据并将它们同步到一个小的测试数据集。

答案 1 :(得分:0)

下图显示了使用完全相同的代码生成的Gingerbread(Cyanogen)和ICS(HTC)组的转储。如您所见,它们在数据呈现方式上有很大差异。出于某种原因,这些小组在ICS中有一定程度的重复。所以问题是如果我打算使用组_ID执行查找,如何在不同版本中管理它。请注意,在ICS上的联系人应用程序中,每个组只出现一次,因此我如何知道它指的是哪个ID?