添加联系人时出现 OperationApplicationException

Posted

技术标签:

【中文标题】添加联系人时出现 OperationApplicationException【英文标题】:OperationApplicationException on adding contact 【发布时间】:2014-08-31 21:57:44 【问题描述】:

我正在尝试使用 ContentProviderOperation 以编程方式将联系人添加到我的联系人电话簿中。

我已经在我的androidManifest.xml 中启用了WRITE_CONTACT 权限。

下面是代码。

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

int rawContactID = ops.size();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
 .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
 .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
 .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, etname.getText().toString())
 .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
 .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
 .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, etmob.getText().toString())
 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
 .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
 .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
 .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, etphone.getText().toString())
 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME)
 .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
 .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE)
 .withValue(ContactsContract.CommonDataKinds.SipAddress.DISPLAY_NAME, etadd.getText().toString())
 .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
 .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
 .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, etmail.getText().toString())
 .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
 .build());

try 
 getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
 Toast.makeText(getBaseContext(), "Contact is successfully added", Toast.LENGTH_SHORT).show();
 catch (RemoteException e) 
 e.printStackTrace();
 catch (OperationApplicationException e) 
 e.printStackTrace();

但我得到了例外。这是我的堆栈跟踪 -

07-10 09:32:31.379    1143-1143/com.example.addcontact.app W/System.err﹕ android.content.OperationApplicationException: insert failed
07-10 09:32:31.379    1143-1143/com.example.addcontact.app W/System.err﹕ at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:158)
07-10 09:32:31.379    1143-1143/com.example.addcontact.app W/System.err﹕ at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:512)
07-10 09:32:31.379    1143-1143/com.example.addcontact.app W/System.err﹕ at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:377)
07-10 09:32:31.379    1143-1143/com.example.addcontact.app W/System.err﹕ at android.content.ContentResolver.applyBatch(ContentResolver.java:1227)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at com.example.addcontact.app.MainActivity$1.onClick(MainActivity.java:85)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at android.view.View.performClick(View.java:4438)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at android.view.View$PerformClick.run(View.java:18422)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
07-10 09:32:31.389    1143-1143/com.example.addcontact.app W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5017)
07-10 09:32:31.399    1143-1143/com.example.addcontact.app W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
07-10 09:32:31.399    1143-1143/com.example.addcontact.app W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
07-10 09:32:31.399    1143-1143/com.example.addcontact.app W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-10 09:32:31.409    1143-1143/com.example.addcontact.app W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-10 09:32:31.409    1143-1143/com.example.addcontact.app W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)

我不确定为什么在下一行插入失败。

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

有什么提示吗?

【问题讨论】:

【参考方案1】:

我注意到你那里有 0,而应该是 rawContactID

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, etname.getText().toString())
                        .build());

我实际上已经开始工作了,你可以在这里查看我的要点。

https://gist.github.com/delacrixmorgan/3b3efef4e449a9366836158c221142cd

【讨论】:

以上是关于添加联系人时出现 OperationApplicationException的主要内容,如果未能解决你的问题,请参考以下文章

检索联系人数据 Android 时出现 RuntimeException

将 ABAddressBook 中的联系人导入文本文件时出现问题

在发送按钮之前单击联系人按钮时出现黑屏

使用电话号码选择联系人而不是读取电话号码时出现问题

在 Xcode 5 中,当我在源代码控制下添加服务器时出现错误

尝试使用 XHR 联系 WCF 服务时出现 400 错误请求