如何在Android中以编程方式将电话号码添加到联系人?

4

我有一个应用程序,可以很好地添加和删除联系人。如果现有联系人中存在某个值,则可以很好地进行修改。但是我似乎无法将新值插入到现有联系人中。例如,如果家庭电话号码已存在,但工作电话号码不存在,我尝试使用以下方法添加该值(传入 idValueworkNumber):

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValue(ContactsContract.Data.CONTACT_ID, idValue)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, workNumber)
            .build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

但是我遇到了一个空指针异常:
java.lang.NullPointerException
    at com.android.providers.contacts.ContactsProvider2.insertData(ContactsProvider2.java:2604)
    at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:2452)
    at com.android.providers.contacts.SQLiteContentProvider.insert(SQLiteContentProvider.java:106)
    at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2256)
    at android.content.ContentProviderOperation.apply(ContentProviderOperation.java:214)
    at com.android.providers.contacts.SQLiteContentProvider.applyBatch(SQLiteContentProvider.java:216)
    at com.android.providers.contacts.ContactsProvider2.applyBatch(ContactsProvider2.java:2290)
    at android.content.ContentProvider$Transport.applyBatch(ContentProvider.java:217)
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:194)
    at android.os.Binder.execTransact(Binder.java:336)
    at dalvik.system.NativeStart.run(Native Method)

请问我做错了什么?

(这是关于IT技术的问题)
2个回答

6
你缺少了 withValue(Phone.TYPE, Phone.TYPE_WORK)。它与电话类型相关联。
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
        .withValue(ContactsContract.Data.RAW_CONTACT_ID, idValue)
        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, workNumber).
withValue(Phone.TYPE, Phone.TYPE_WORK)
        .build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

编辑

您是正确的,我检查了 data 表的模式,它只使用原始联系人ID而不是联系人ID。

CREATE TABLE data (_id INTEGER PRIMARY KEY AUTOINCREMENT,
package_id INTEGER REFERENCES package(_id),
mimetype_id INTEGER REFERENCES mimetype(_id) NOT NULL,
raw_contact_id INTEGER REFERENCES raw_contacts(_id) NOT NULL,
is_primary INTEGER NOT NULL DEFAULT 0,
is_super_primary INTEGER NOT NULL DEFAULT 0,
data_version INTEGER NOT NULL DEFAULT 0,
data1 TEXT,
data2 TEXT,
data3 TEXT,
data4 TEXT,
data5 TEXT,
data6 TEXT,
data7 TEXT,
data8 TEXT,
data9 TEXT,
data10 TEXT,
data11 TEXT,
data12 TEXT,
data13 TEXT,
data14 TEXT,
data15 TEXT,
data_sync1 TEXT, 
data_sync2 TEXT, 
data_sync3 TEXT, 
data_sync4 TEXT );

谢谢,我真是太蠢了,不过那并没有引起问题。我已经更新了原帖中的代码,但仍然出现错误。 - user496854
现在看来,你的问题不在这些代码行上。 - Vivek
你是什么意思?代码抛出了异常——怎么可能是我的问题? - user496854
这意味着我在我的端口做了相同的代码,它可以正常工作。调试代码或者记录日志,找到错误出现的确切位置。 - Vivek
谢谢你的帮助 - 我找到了问题,但出于某种原因它没有通过CONTACT_ID找到联系人,而是想要RAW_CONTACT_ID。我真的很想接受你的答案并给你分数,但我不能用当前的方式来做。你能否请更改为“.withValue(ContactsContract.Data.RAW_CONTACT_ID, idValue)”?然后我会接受它。 - user496854
我使用了 Data.RAW_CONTACT_ID。我的错误在于我没有仔细检查它。 - Vivek

1
由于Android不允许直接向联系人表添加联系人,因此您会收到错误。相反,您需要修改或添加一个原始联系人,Android将自动为您创建一个联系人。

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