Android contacts contract.Groups.ACCOUNT\u NAME/TYPE的用途是什么?
尝试创建新联系人组时,我发现新组无法在手机中显示,除非我设置了Android contacts contract.Groups.ACCOUNT\u NAME/TYPE的用途是什么?,android,contacts,android-contacts,Android,Contacts,Android Contacts,尝试创建新联系人组时,我发现新组无法在手机中显示,除非我设置了contacts contract.Groups.ACCOUNT\u NAME和ACCOUNT\u TYPE: ArrayList<ContentProviderOperation> o = new ArrayList<ContentProviderOperation>(); o.add(ContentProviderOperation.newInsert(Groups.CONTENT_URI) .
contacts contract.Groups.ACCOUNT\u NAME和ACCOUNT\u 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;
}
ArrayList o=new ArrayList();
o、 添加(ContentProviderOperation.newInsert(Groups.CONTENT\u URI)
.withValue(contacts contract.Groups.TITLE,groupTitle)
.带值(contacts contract.Groups.GROUP_可见,为真)
.withValue(contacts contract.Groups.ACCOUNT\u NAME,“local@ztespecial_local.com“”//如果没有这两行,将不会显示新组
.withValue(contacts contract.Groups.ACCOUNT_TYPE,“local@ztespecial_local.com")
.build());
试一试{
getContentResolver().applyBatch(contacts contract.AUTHORITY,o);
}捕获(例外e){
Log.e(“ContactsManager”,“未能创建新的联系人组:”+e);
返回;
}
通过列出所有组,我发现在系统的联系人应用程序中不会看到帐户类型/名称为null的所有组,即使是组。VISIBLE
为true
是否有一个准则规定我应该为一个新组设置什么值?看起来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 };
}
私有字符串[]getDefaultAccountNameAndType(){
字符串accountType=“”;
字符串accountName=“”;
长rawContactId=0;
Uri rawContactUri=null;
ContentProviderResult[]结果=null;
ArrayList ops=新的ArrayList();
add(ContentProviderOperation.newInsert(RawContacts.CONTENT\u URI).withValue(RawContacts.ACCOUNT\u NAME,null).withValue(RawContacts.ACCOUNT\u TYPE,null.build());
试一试{
结果=getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
}捕获(例外e){
e、 printStackTrace();
}最后{
ops.clear();
}
对于(ContentProviderResult:results){
rawContactUri=result.uri;
rawContactId=ContentUris.parseId(rawContactUri);
}
游标c=getContentResolver().query(
rawscontacts.CONTENT\u URI
,新字符串[]{rawscontacts.ACCOUNT_TYPE,rawscontacts.ACCOUNT_NAME}
,RawContacts._ID+“=?”
,新字符串[]{String.valueOf(rawContactId)}
,空);
if(c.moveToFirst()){
如果(!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=零;
返回新字符串[]{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;
}
String accountNameType[]=getDefaultAccountNameAndType();
ArrayList o=新的ArrayList();
o、 添加(ContentProviderOperation.newInsert(Groups.CONTENT\u URI)
.withValue(Groups.TITLE、groupTitle)
.withValue(Groups.GROUP\u可见,true)
.withValue(Groups.ACCOUNT\u NAME,accountNameType[0])
.withValue(Groups.ACCOUNT\u类型,accountNameType[1])
.build());
试一试{
getContentResolver().applyBatch(contacts contract.AUTHORITY,o);
}捕获(例外e){
Log.e(“ContactsManager”,“未能创建新的联系人组:”+e);
返回;
}
账户都是某种类型的。您希望为哪种类型的帐户创建组?这些是谷歌联系人还是其他联系人类型
帐户类型可以是“com.google”,例如,当它是google帐户时。但您也可以使用自己的自定义帐户类型。然后您需要一个帐户验证器,请参见:此功能与今天一样有效。我可以通过上述方法创建联络小组。谢谢@Deqing