【问题标题】:What is ContactsContract.Groups.ACCOUNT_NAME/TYPE for?ContactsContract.Groups.ACCOUNT_NAME/TYPE 有什么用?
【发布时间】:2013-10-10 06:23:58
【问题描述】:

在尝试创建新的Contact group时,发现新的group在手机上是看不到的,除非我设置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为空的所有组在系统的Contact应用程序中都不会出现,即使它的Groups.VISIBLE为true。

是否有关于我应该为新组设置什么值的指南?

【问题讨论】:

    标签: android contacts android-contacts


    【解决方案1】:

    看起来 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;
    }
    

    【讨论】:

    • 这和今天一样。我可以通过上述方法创建联系人组。谢谢@德清
    【解决方案2】:

    帐户总是特定类型的。您想为什么样的帐户创建组?这些是 Google 通讯录还是其他联系人类型?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2013-10-14
      相关资源
      最近更新 更多