2010-07-26 80 views
2

我正在使用以下代码段来创建新联系人。它紧随Android提供的ContactManager示例。 问题是,创建的联系人不会显示在Android附带的Contacts应用程序中。不过,当我加载电话簿中的所有联系人时,我可以看到新创建的联系人。使用ContactsContract创建的新联系人不会显示在联系人应用程序中

私人无效insertPBEntry() 将抛出RemoteException,OperationApplicationException {

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

    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "Account type") 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "Account name") 
      .build()); 

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, 
        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "TOTAL_NEW") 
      .build()); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, 
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "9090") 
      .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_MOBILE) 
      .build());  
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

} 

我搜索很难,但还没有找到答案。我找到了一个答案,表明问题可能与我的字符串“账户类型”和“账户名称”有关。对于我的情况,我不需要创建任何帐户。我只需要添加一个名称,电子邮件/邮件地址,电话的新联系人。

谢谢,伙计们!

+0

所有联系人都必须插入帐户下。进一步调查。 – Pentium10 2010-07-26 17:33:44

+0

经过进一步调查,我发现这个:http://osdir.com/ml/Android-Developers/2010-05/msg03859.html 因此,使用上述代码创建的联系人未显示可能是因为他们不'对于开启可视性的组,将会很长。因此,一切都归结为在使用其界面时找到在“通讯录”应用程序中创建的联系人的组ID。 我试图从ContactsContracts.Groups中获取所有组并获得ZERO组。同样,从GroupMembership获取数据将返回ZERO组成员资格。有趣!让我们看看如何... – 2010-07-27 15:36:27

回答

7

Google提供的示例代码工作。只要它在模拟器上运行时,就不会发现任何帐户或组将附加创建的联系人。并且默认情况下,这个新创建的联系人不可见。

使用实际的手机(对于我的情况,HTC Dream),在检测到帐户名称和类型以供应代码后,它可以正常工作。或者,我们可以获得可见的组ID,并将新联系人附加到其中一个组。

获得可用帐户:

//accounts 
    Account[] accounts = AccountManager.get(act).getAccounts(); 
    for (Account acc : accounts){ 
     Log.d(TAG, "account name = " + acc.name + ", type = " + acc.type); 
    } 

要获取组的列表:

//group membership info 
    String[] tempFields = new String[] { 
      GroupMembership.GROUP_ROW_ID, GroupMembership.GROUP_SOURCE_ID}; 
    Cursor tempCur = act.managedQuery(Data.CONTENT_URI, tempFields, 
      Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + "'", 
      null, null); 

现在,如果我们希望新的联系人添加到组,而不是一个帐户关联:

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
      .withValueBackReference(Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE) 
      .withValue(GroupMembership.GROUP_SOURCE_ID, *<THE_IDENTIFIED_GROUP_ID>*) 
      .build()); 

希望它有帮助。

+0

hungh3,是否可以在没有账户的情况下直接将联系人添加到群组? – Mikey 2010-10-14 09:44:38

+0

是的。但在模拟器上,我无法获得任何组。在真实的电话上,应该有> = 1个组。然后将新联系人添加到您选择的组中,如上所示。 – 2010-10-15 06:06:13

0

您是否尝试将组的可见性设置为true?

在联系人标签按下菜单按钮,比“显示选项”>您的帐户,并选中复选框和“完成”。

+0

我使用的是HTC Dream,我无法找到与您所提及的完全相同的细节。但是,我的所有联系人似乎都属于某个默认组,并且该组已被设置为可见(因为此组中的所有其他联系人都是手动创建的)。无论如何,感谢您的建议。 – 2010-08-30 14:10:53

5

要在没有任何团体或帐户模拟器添加一个帐户,只是把“空”为您的帐户或组ID,替换的代码行这样

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

的HTC Sense和MOTOBLUR可能会有问题与联系人。我不知道这里的任何信息(http://stackoverflow.com/questions/4431101/created-contacts-not-showing-up-on-htc-evo)是否有用。

相关问题