通过编程将新的Android联系人插入手机

通过编程将新的Android联系人插入手机,android,Android,我正在编写一个应用程序,允许用户从Android设备中删除联系人,并将其存储在单独的数据库中。他们也应该能够恢复他们的手机联系人,但我有这个部分的问题。我从数据库中检索联系人信息,并创建一个联系人对象,其中包含联系人ID、查找键、结构化名称、组织、电话对象数组列表(其中包含电话号码和类型)等。所有这些都在那里。我将该信息恢复到手机的功能如下所示: public void addContact(Contact contact) { ContentValues values = new Co

我正在编写一个应用程序,允许用户从Android设备中删除联系人,并将其存储在单独的数据库中。他们也应该能够恢复他们的手机联系人,但我有这个部分的问题。我从数据库中检索联系人信息,并创建一个联系人对象,其中包含联系人ID、查找键、结构化名称、组织、电话对象数组列表(其中包含电话号码和类型)等。所有这些都在那里。我将该信息恢复到手机的功能如下所示:

public void addContact(Contact contact)
{
    ContentValues values = new ContentValues();
    values.put("contact_id", contact.getContactId());
    values.put("lookup", contact.getLookupKey());
    values.put("mimetype", StructuredName.CONTENT_ITEM_TYPE);
    values.put("data1", contact.getStructuredName().getDisplayName());
    values.put("data2", contact.getStructuredName().getGivenName());
    values.put("data3", contact.getStructuredName().getFamilyName());
    values.put("data4", contact.getStructuredName().getPrefix());
    values.put("data5", contact.getStructuredName().getMiddleName());
    values.put("data6", contact.getStructuredName().getSuffix());
    context.getContentResolver().insert(Data.CONTENT_URI, values);
}
这就是应用程序崩溃的原因。我使用此方法将数据插入到数据库中,没有任何问题,并且我可以验证数据是否正确存储。所以我猜有比这更好的方法将联系人插入设备,但我不知道那会是什么。有人能给我一个例子,以编程方式创建一个联系人并将其插入到用户的设备中吗?即使我能看到一个只创建了一个显示名的联系人,我也会感到满意

如果有必要,我还尝试将此代码置于结构化名称的插入之上,但没有效果:

values.put("_id", contact.getContactId());
values.put("lookup", contact.getLookupKey());
values.put("display_name", contact.getStructuredName().getDisplayName());
context.getContentResolver().insert(Contacts.CONTENT_URI, values);
values.clear();
编辑:以下是应用程序崩溃时我的logcat错误日志:

05-07 20:31:53.941: E/Trace(819): error opening trace file: No such file or directory (2)
05-07 20:34:39.035: D/AndroidRuntime(853): Shutting down VM
05-07 20:34:39.048: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
05-07 20:34:39.197: E/AndroidRuntime(853): FATAL EXCEPTION: main
05-07 20:34:39.197: E/AndroidRuntime(853): java.lang.NullPointerException
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.os.Parcel.readException(Parcel.java:1431)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.content.ContentResolver.insert(ContentResolver.java:866)
05-07 20:34:39.197: E/AndroidRuntime(853):  at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:58)
05-07 20:34:39.197: E/AndroidRuntime(853):  at com.protextyou.StartPage$12.onClick(StartPage.java:542)
05-07 20:34:39.197: E/AndroidRuntime(853):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.os.Looper.loop(Looper.java:137)
05-07 20:34:39.197: E/AndroidRuntime(853):  at android.app.ActivityThread.main(ActivityThread.java:5041)
05-07 20:34:39.197: E/AndroidRuntime(853):  at java.lang.reflect.Method.invokeNative(Native Method)
05-07 20:34:39.197: E/AndroidRuntime(853):  at java.lang.reflect.Method.invoke(Method.java:511)
05-07 20:34:39.197: E/AndroidRuntime(853):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-07 20:34:39.197: E/AndroidRuntime(853):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-07 20:34:39.197: E/AndroidRuntime(853):  at dalvik.system.NativeStart.main(Native Method)

使用上述代码

arraylistops=
新的ArrayList();
add(ContentProviderOperation.newInsert(Data.CONTENT\u URI)
.withValue(Data.RAW\u CONTACT\u ID,RAW CONTACT ID)
.withValue(Data.MIMETYPE、Phone.CONTENT\u ITEM\u TYPE)
.带值(电话号码,“1-800-GOOG-411”)
.withValue(Phone.TYPE,Phone.TYPE\u自定义)
.withValue(Phone.LABEL,“免费目录帮助”)
.build());
getContentResolver().applyBatch(contacts contract.AUTHORITY,ops);

如果崩溃,日志中应该有堆栈跟踪。请把日志贴出来。呃,我不确定该贴哪一部分。logcat中会弹出一系列错误,下面是最常见的几个错误:
05-07 09:07:02.334:E/Trace(3052):打开跟踪文件时出错:没有这样的文件或目录(2)
05-07 09:07:21.483:E/AndroidRuntime(3052):致命异常:main
05-07 09:07:21.483:E/AndroidRuntime(3052):java.lang.NullPointerException
05-07 09:07:21.483:E/AndroidRuntime(3052):在android.os.Parcel.readException(Parcel.java:1431)
05-07 09:07:21.483:E/AndroidRuntime(3052):在android.database.DatabaseUtils.readException fromParcel(DatabaseUtils.java:185)
关于
NullPointerException
的部分是要发布的部分。编辑您的问题并添加完整的堆栈跟踪,而不仅仅是前两行。好的,我添加了完整的堆栈跟踪。我希望这有帮助@AleksGI尝试了你的代码,但应用程序仍然崩溃。然后我尝试了你发布的第一个链接中最上面答案的代码,Toast发现了一个“异常:Null”。但我不知道该怎么办。你有写联系人的权限吗?是的,我有读写权限,
,我已经可以删除联系人了(我通过从
RawContacts.CONTENT\u URI
中删除来完成此操作),所以我不认为权限是我的问题。@Niravranpara我已将答案标记为正确,因为虽然它没有解决我的问题,但它是对我请求的正确响应,例如将联系人插入联系人的设备。显然,我的问题不是我编写实际插入的方式,而是另一个问题这是我的代码:ContentValues=newcontentvalues();values.put(Data.RAW\u CONTACT\u ID,mUserObj.getcardname());values.put(Data.MIMETYPE,Phone.CONTENT\u ITEM\u TYPE);values.put(Phone.NUMBER,mUserObj.getPhoneNumber());values.put(Phone.TYPE,Phone.TYPE_CUSTOM);values.put(Phone.LABEL,mUserObj.getFullName());Uri dataUri=self.getContentResolver().insert(Data.CONTENT_Uri,values);它不做任何事情。
ContentValues values = new ContentValues();
            values.put(Data.RAW_CONTACT_ID, 001);
            values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
            values.put(Phone.NUMBER, "1-800-GOOG-411");
            values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
            values.put(Phone.LABEL, "Nirav");
            Uri dataUri = getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
ArrayList<ContentProviderOperation> ops =
      new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
      .withValue(Data.RAW_CONTACT_ID, rawContactId)
      .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
      .withValue(Phone.NUMBER, "1-800-GOOG-411")
      .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
      .withValue(Phone.LABEL, "free directory assistance")
      .build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);