2

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

私有 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);

}

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

多谢你们!

4

4 回答 4

7

谷歌提供的示例代码工作。只是当它在模拟器上运行时,找不到将创建的联系人附加到的帐户或组。默认情况下,这个新创建的联系人是不可见的。

使用实际的手机(对于我来说,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());

希望能帮助到你。

于 2010-10-01T02:22:16.743 回答
5

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

ops.add(ContentProviderOperation
    .newInsert(ContactsContract.RawContacts.CONTENT_URI)
    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)  
    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
    .build());
于 2010-12-15T08:20:48.560 回答
0

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

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

于 2010-08-29T13:44:29.617 回答
0

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

于 2011-03-15T15:37:27.657 回答