修改联系信息

17
我是一名有用的助手,可以为您翻译文本。
我正在尝试在现有联系人上插入和更新信息,因此我创建了一个示例应用程序来开发此功能。我希望我的示例应用程序能够在联系人上插入(如果存在)或更新电子邮件地址。
我通过系统意图选择联系人,如下所示:
    startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST);

返回的URI是所选的“联系人”(“原始联系人”?)的URI,格式如下:content://com.android.contacts/contacts/lookup/0r2-2A90214945/2
我可以通过执行以下代码来获取所有这些“数据”(“原始联系人”?)项:
Cursor cursor = contentResolver.query(mContactUri, null, null, null, null);
try {
    if (cursor.moveToFirst()) {
        for(int i=0; i < cursor.getColumnCount(); i++) {
            String message = cursor.getColumnName(i);
            Log.v("", message);
        }
    }
} finally {
    cursor.close();
}

通过这个,我应该能够确定联系人是否已经有一个 CommonDataTypes.Email Data 成员:

cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1;

然后执行以下操作之一,以便 插入更新 Data

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

ops.add(ContentProviderOperation.newInsert(mContactUri)
    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
    .withValue(Email.DISPLAY_NAME, "somebody@android.com")
    .withValue(Email.TYPE, Email.TYPE_HOME)
    .build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

但是这给了我一个异常:

java.lang.UnsupportedOperationException: URI: content://com.android.contacts/contacts/lookup/0r2-2A90314945/2, calling user:

希望有人能看出我错过了什么。

PS,我正在使用以下权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

好的,我会将其移除。谢谢。 - Alok Kulkarni
1个回答

44

安卓开发人员需要更新他们的文档。这份文档实际上让我对正在发生的事情了解得比猜测还要少。它建议您可以返回一个Contact,其中将包含许多RawContacts,这些RawContacts将包含Data

这种解释完全是错误的。相反,ContactContracts数据实际上是三个普通的数据库表:

ContactContract表格

表格:Contacts

访问URI:Contacts.CONTENT_URI

主键**:Data._ID

描述:

此表格包含有关联系人的信息(何时添加、用户图标、是否有自定义铃声等)。

关系:与RawContact表格具有1对多的关系。

表格:RawContacts

访问URI:RawContacts.CONTENT_URI

主键:Data._ID

外键**:Data.CONTACT_ID

描述:

此表格包含有关相关数据项集的信息。RawContact可能包含邮件类型、邮件显示名称、电话号码、电话显示名称等。RawContact可以与其他RawContacts进行聚合,以便用户将其视为一个Contact。Contact可能仅包含一个RawContact。

关系:与Data表格具有1对多的关系。

表格:Data

访问URI: Data.CONTENT_URI

主键: Data._ID

外键: Data.RAW_CONTACT_ID

描述:

该表包含一项信息。电子邮件地址、电话号码、电话号码类型(家庭/工作)、昵称、显示名称。

回答问题:

我已将整个示例项目上传到GitHub,以便其他人可以查看如何使用ContactContract查询、更新和插入记录。

您可以在此处找到项目下载链接: https://github.com/gwoodhouse/ContactContractSample

如果您只想查看执行查询/更新/插入的Java代码,可以在此处找到类文件: https://github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity/ContactsIntegrationActivity.java

希望这能有所帮助!

*不是表格,而是一个ContentProvider

** 不完全准确。


引用你的话:“一个联系人可以只包含一个原始联系人”...我认为一个联系人是许多原始联系人的结合。如果我错了,请纠正我。 - Harsh Vardhan
(虽然有一段时间了,但是)我认为一个“联系人”可以只包含单个“原始联系人”并仍然有效。 - Graeme
1
是的,但如果它包含许多原始联系人,它仍然有效。 感谢这个项目。 - Harsh Vardhan
嘿,格雷姆。我知道这不应该在这里问,但是如何修改/添加SipAddress而不是电子邮件地址呢? - Harsh Vardhan
@Graeme,在你的项目中更新时,getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 抛出了空指针异常。你能帮我吗? - tejas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接