4

当我想创建一个新联系人时,我想我必须设置一个 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);
4

3 回答 3

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());
于 2012-10-30T07:31:36.300 回答
0

我想我在 JB 上发现了一些奇怪的问题,其代码在以前版本的 android 上运行良好。当您要求创建共享相同基本名称的联系人时,创建过程并没有按照应有的方式进行,并且 withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 返回的原始联系人 ID 似乎相同。

例如,尝试创建 Contact1、Contact2 和 Contact3:奇怪的东西开始了。您很可能看不到任何联系人,但尝试使用 API 删除联系人将导致告诉您该联系人确实存在。

我不确定这是否是破坏我的果冻豆平台的结果,或者它是否是 android 版本的常见问题。请注意,我指的是正在开发的平台。

有没有人看到这个,例如在 4.1.2 上?

于 2012-12-10T17:20:20.697 回答
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(); 
  }
}
于 2015-12-26T03:03:14.810 回答