什么是ContactsContract.Groups.ACCOUNT_NAME / TYPE?

时间:2013-10-10 06:23:59

标签: android contacts android-contacts

尝试创建新的联系人群组时,我发现在移动设备中无法看到新群组,除非我设置ContactsContract.Groups.ACCOUNT_NAME and ACCOUNT_TYPE

ArrayList<ContentProviderOperation> o = new ArrayList<ContentProviderOperation>();
o.add(ContentProviderOperation.newInsert(Groups.CONTENT_URI)
      .withValue(ContactsContract.Groups.TITLE, groupTitle)
      .withValue(ContactsContract.Groups.GROUP_VISIBLE, true)
      .withValue(ContactsContract.Groups.ACCOUNT_NAME, "local@ztespecial_local.com") // without these two lines the new group will not be shown
      .withValue(ContactsContract.Groups.ACCOUNT_TYPE, "local@ztespecial_local.com")
      .build());
try {
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, o);
} catch (Exception e) {
    Log.e("ContactsManager", "Failed to create new contact group: "+e);
    return;
}

通过列出所有组,我发现ACCOUNT_TYPE/NAME为空的所有组都不会出现在系统的联系人应用程序中,即使其Groups.VISIBLE为真。

是否有指导我应该为新组设置什么值?

2 个答案:

答案 0 :(得分:0)

看起来Android中的联系人可能有多个帐户,系统的联系人应用程序可能只显示感兴趣的帐户。因此,一种正确的方法是获取默认帐户名称和类型。

以下是获取默认帐户名称并输入以下内容的函数:

private String[] getDefaultAccountNameAndType() {
    String accountType = "";
    String accountName = "";

    long rawContactId = 0;
    Uri rawContactUri = null;
    ContentProviderResult[] results = null;

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_NAME, null).withValue(RawContacts.ACCOUNT_TYPE, null).build());

    try {
        results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        ops.clear();
    }

    for (ContentProviderResult result : results) {
        rawContactUri = result.uri;
        rawContactId = ContentUris.parseId(rawContactUri);
    }

    Cursor c = getContentResolver().query(
            RawContacts.CONTENT_URI
            , new String[] {RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME}
            , RawContacts._ID+"=?"
            , new String[] {String.valueOf(rawContactId)}
            , null);

    if(c.moveToFirst()) {
        if(!c.isAfterLast()) {
            accountType = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_TYPE));
            accountName = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_NAME));
        }
    }

    getContentResolver().delete(rawContactUri, null, null);

    c.close();
    c = null;

    return new String[] { accountName, accountType };
}

然后我们可以在创建新组时设置它们:

String accountNameType[] = getDefaultAccountNameAndType();
ArrayList<ContentProviderOperation> o = new ArrayList<ContentProviderOperation>();
o.add(ContentProviderOperation.newInsert(Groups.CONTENT_URI)
      .withValue(Groups.TITLE, groupTitle)
      .withValue(Groups.GROUP_VISIBLE, true)
      .withValue(Groups.ACCOUNT_NAME, accountNameType[0])
      .withValue(Groups.ACCOUNT_TYPE, accountNameType[1])
      .build());
try {
  getContentResolver().applyBatch(ContactsContract.AUTHORITY, o);
} catch (Exception e) {
  Log.e("ContactsManager", "Failed to create new contact group: "+e);
  return;
}

答案 1 :(得分:0)

帐户总是属于某种类型。您想为什么类型的帐户创建群组?这些是Google联系人还是其他联系人类型?

帐户类型可以是&#34; com.google&#34;例如,当它是Google帐户时。但您也可以使用自己的自定义帐户类型。然后,您需要一个帐户身份验证器,请参阅:https://developer.android.com/training/sync-adapters/creating-authenticator.html