列出Android中的所有Google联系人群组

时间:2011-12-26 20:09:44

标签: android sdk

我想列出Google帐户中的所有联系人群组,并使用户可以选择某些群组为“特殊”。当收到的号码属于某个“特殊”组时,我想采取行动。

我找不到太多关于此的例子。有人做过你想分享的类似事情吗?

2 个答案:

答案 0 :(得分:5)

这里有三个问题:

  1. 如何枚举给定帐户的联系人群组。
  2. 如何将群组标记为特殊群组。
  3. 如何对该群组中的联系人采取行动。
  4. 所以,顺着名单......

    <强> 1。枚举联系人组

    ContactsContract.Groups表存储系统上的联系人组列表。因此,您需要发出如下所示的查询:

    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        Uri uri = ContactsContract.Groups.CONTENT_URI;
        Log.i(TAG, "URI: " + uri);
        String[] projection = new String[] {
               ContactsContract.Groups._ID,
               ContactsContract.Groups.TITLE
        };
        return new CursorLoader(this, uri, projection, null, null, null);
    }
    

    此加载程序将为您提供系统上所有组的列表及其数据库ID。

    如何将组标记为特殊

    这是您的应用程序需要处理的事情。只需维护特殊列表中的组ID列表。

    要确定联系人是否在“特殊”组中,您可以使用SQL where子句查询ContactsContract.Data表,如下所示:

    String where = ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID
            + "="
            + groupid
            + " AND "
            + ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE
            + "='"
            + ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
            + "'";
    

    其中groupid是您标记为特殊的组的数据库ID。 (如果您有多个组,请开始添加OR子句。)

    (您需要检查CONTENT_ITEM_TYPE mimetype,因为ContactsContract.Data表用于存储联系人的任意元数据,并且该表中列的含义因mimetype而异。GroupMembership.GROUP_ROW_ID只是一个指向列data1的指针。)

    第3。如何对该群组中的联系人采取行动

    这取决于您要完成的任务,但通常情况下,您将创建一个侦听android.intent.action.PHONE_STATE的广播接收器。如果TelephonyManager.EXTRA_STATE中的状态列为TelephonyManager.EXTRA_STATE_RINGING,那么您可以通过查看TelephonyManager.EXTRA_INCOMING_NUMBER来查找电话号码来获取电话号码。

    (本文附带的示例代码:http://www.krvarma.com/2010/08/detecting-incoming-and-outgoing-calls-in-android/

    然后,您需要再次检查“联系人”数据库​​,以查找具有该电话号码的任何已知联系人。您可以使用ContactsContract.PhoneLookup表格执行此操作。

    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,...
    

    这将在ContactsContract.Contacts表中为您提供联系人的数据库ID。这里的最后一步是将其与该联系人的ContactsContract.RawContacts行匹配(使用CONTACT_ID列进行搜索),并找到代表该联系人的RawContacts _ID集。然后,您将使用它来搜索组成员资格表,如上所述。

答案 1 :(得分:2)

我找到了通过Android中所有帐户获取正确群组的方法:

@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
    Uri uri = ContactsContract.Groups.CONTENT_SUMMARY_URI;
    String[] projection = null;
    //this is correct selection for retrieving groups from android
    String selection = ContactsContract.Groups.ACCOUNT_TYPE + " NOT NULL AND " + 
    ContactsContract.Groups.ACCOUNT_NAME + " NOT NULL AND " + ContactsContract.Groups.DELETED + "=0";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        selection += " AND " + ContactsContract.Groups.AUTO_ADD + "=0 AND " + ContactsContract.Groups.FAVORITES + "=0";
    }

    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Groups.TITLE + " ASC";
    Loader<Cursor> loader = null;

    switch(loaderId) {
    case GROUPS_LOADER:
        loader = new CursorLoader(getActivity(), uri, projection, selection, selectionArgs, sortOrder);
        break;
    default:
        break;
    }

    return loader;
}

来源:grepcode.com