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

问题描述:

我有一个应用程序,可以添加和删除联系人就好了。如果现有联系人中有现有值,则可以进行修改。但我似乎无法将新值插入现有的联系人。例如,如果有一个家庭电话号码的现有价值,而不是为工作电话号码,我尝试使用fillowing增加值(cintact idValueworkNumber传递中):如何在Android中以编程方式向联系人添加电话号码?

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

但我得到一个NullPointerException:

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) 

有人能告诉我我做错了什么吗?

你缺少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); 
+0

谢谢,那是我的头脑,但那不是造成问题。我更新了原始文章中的代码,但仍然收到错误。 – user496854

+0

这似乎是现在你的问题不在这一行。 – Vivek

+0

你是什么意思?代码是一个例外 - 它怎么会是我的一个问题? – user496854

由于Android不允许您访问直接添加联系人给你联系表。相反,您需要修改或添加原始联系人,Android会自动为您创建联系人。