当我想创建一个新的联系人时,我想我必须设置一个RAW_CONTACT_ID。如果不是这些代码如何表现良好。我对吗?如果不是,它是如何知道这些数据属于同一个联系人的。如果是,如何设置RAW_CONTACT_ID?也许问题可以这样说:我怎样才能获得不存在的新RAW_CONTACT_ID?然后发布我的代码(我将0设置为RAW_CONTACT_ID):
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
// ------------------------------------------------------ Names
if (displayName != null) {
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,
displayName).build());
}
// ------------------------------------------------------ Mobile Number
if (mobileNumber != null) {
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(
ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,
mobileNumber)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
}
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
答案 0 :(得分:2)
你必须使用int rawContactInsertIndex = ops.size(),如下所示。
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE, null).withValue(RawContacts.ACCOUNT_NAME, null).build());
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME, personalVcard.getFirstName()).build());
答案 1 :(得分:0)
我想我已经在JB上发现了一些奇怪的问题,使用相同的代码,在以前版本的android上运行良好。当您要求创建共享相同基本名称的联系人时,创建不会按照应有的方式进行,并且withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,0)返回的原始联系人ID似乎是相同的。
例如,尝试创建Contact1,Contact2和Contact3:奇怪的东西开始了。您很可能看不到任何联系人,但尝试使用API删除联系人将告诉您该联系人实际存在。
我不确定这是否是破坏我的Jelly Bean平台的结果,或者它是否是Android构建中的常见问题。请注意,我正在开发一个正在开发的平台。
有人见过这个,例如4.1.2吗?
答案 2 :(得分:0)
此代码块会将联系人姓名保存到手机号码
private void saveContact() {
this.sessionpref.setPreference("Saved", "Done");
ArrayList<ContentProviderOperation> ops = new ArrayList();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue("account_type", null).withValue("account_name", null).build());
if (this.DisplayName != null) {
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/name")
.withValue("data1", this.DisplayName)
.build());
} else {
Toast.makeText(getApplicationContext(), "Contact Exist", 3000).show();
}
if (this.MobileNumber != null) {
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
.withValue("data1", this.MobileNumber).withValue("data2", Integer.valueOf(2))
.build());
} else {
Toast.makeText(getApplicationContext(), "Contact Exist", 3000).show();
}
try {
getContentResolver().applyBatch("com.android.contacts", ops);
} catch (Exception e) {
e.printStackTrace();
}
}