【问题标题】:New contacts created using ContactsContract do not appear in Contacts app使用 ContactsContract 创建的新联系人不会出现在联系人应用程序中
【发布时间】:2011-03-21 03:28:25
【问题描述】:

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

private void 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);

}

我已经努力寻找,但还没有找到答案。我发现一个答案表明问题可能与我的字符串“帐户类型”和“帐户名称”有关。就我而言,我不需要创建任何帐户。我想要的只是添加一个带有姓名、电子邮件/邮件地址、电话的新联系人。

谢谢各位!

【问题讨论】:

  • 所有联系人都必须插入到一个帐户下。进一步调查。
  • 经过进一步调查,我发现:osdir.com/ml/Android-Developers/2010-05/msg03859.html 因此,使用上述代码创建的那些联系人未显示可能是因为他们对已打开可见性的组的时间不长。因此,一切都归结为在使用其界面时查找在联系人应用程序中创建的那些联系人的组 ID。我试图从 ContactsContracts.Groups 获取所有组并获得零组。同样,从 GroupMembership 获取数据返回零组成员资格。有趣的!让我们看看如何......

标签: android contactscontract


【解决方案1】:

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());

希望对您有所帮助。

【讨论】:

  • hungh3,是否可以在没有帐户的情况下直接将联系人添加到组中?
  • 是的。但是在模拟器上,我无法获得任何组。在真正的手机上,应该有 >= 1 个组。然后将新联系人附加到您选择的组,如上图所示。
【解决方案2】:

要在模拟器中添加一个没有组或帐户的帐户,只需将“null”作为您的帐户或组ID,替换如下代码行

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

【讨论】:

    【解决方案3】:

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

    在“联系人”选项卡中按菜单按钮,然后选择“显示选项”>您的帐户,然后选中复选框并“完成”。

    【讨论】:

    • 我正在使用 HTC Dream,但找不到与您提到的完全相同的详细信息。但是,我的所有联系人似乎都属于某个默认组,并且该组已设置为可见(因为该组中的所有其他联系人,都是手动创建的,都是可见的)。不管怎样,谢谢你的建议。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多