2013-10-10 53 views
0

当试图创建新的联系人组,我发现,新组不能在移动中可以看出,除非我设置ContactsContract.Groups.ACCOUNT_NAME and ACCOUNT_TYPE什么是ContactsContract.Groups.ACCOUNT_NAME/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, "[email protected]_local.com") // without these two lines the new group will not be shown 
     .withValue(ContactsContract.Groups.ACCOUNT_TYPE, "[email protected]_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也是如此。

有没有一个指导方针,我应该为新组设定什么价值?

回答

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; 
} 
相关问题