【问题标题】:android ContactsContract.CommonDataKinds.GroupMembership and ICSandroid ContactsContract.CommonDataKinds.GroupMembership 和 ICS
【发布时间】:2012-11-04 12:30:41
【问题描述】:

我需要确定某个特定联系人是否是给定组的成员。我一直在使用下面的代码,并证明它可以使用运行 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):检查组成员中的联系人 ID: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):检查组成员中的联系人 ID: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):检查组成员中的联系人 ID: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):检查组成员中的联系人 ID: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

附:请有足够权限的人将“GroupMembership”作为标签添加到网站。

【问题讨论】:

  • 我已经更新了用于列出设备上的组的代码(在单独的应用程序中运行)也返回 groups.SYSTEM_ID 并且现在返回组 _ID 为 11, 12 和 13。所以现在我必须弄清楚如何根据 system_id 进行选择,这有点棘手,因为同一组的某些条目出现 2 或 3 次(基于 Groups.TITLE)。代码是: final Cursor cursor = contentResolver.query(Uri.parse("content://com.android.contacts/groups"), (new String[] { Groups._ID, Groups.SYSTEM_ID, Groups.TITLE}) , null, null, null);

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


【解决方案1】:

Honeycomb 和 4.0.3 之间的组成员身份没有任何变化。

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

【讨论】:

  • 请看下面的图片,其中有一张作为组转储返回的照片 - 来自 Gingerbread 和 ICS。如您所见,它非常不同... c9790530-a-62cb3a1a-s-sites.googlegroups.com/site/dannyruttle/…">
【解决方案2】:

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

【讨论】:

  • 我想答案是使用组名作为关键数据来执行查找,这不是我所说的理想,但如果我沿着方式。如果有人能够发现为什么这些差异如此之大,或者如何以另一种方式解决这些差异,我会很高兴从你这里。
  • 我很久以前就知道了,但直到现在还没有时间更新。该查询返回电话组和 Google 组,并使用组名称作为键起作用,因为无论用户的联系人条目被标记在何处(即在手机上或在 Google 中),它都会获取正确的成员资格。
猜你喜欢
  • 2012-07-18
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2012-06-03
  • 2012-07-20
相关资源
最近更新 更多