将联系人事件添加到Android的联系人表中

时间:2012-01-26 22:07:28

标签: android contacts android-contacts contactscontract

我在以下代码上努力工作,但不幸的是,该条目被分配给了错误的联系人。我不知道为什么。经过小时天的测试,但找不到错误。你能帮帮我吗?

我想使用该代码从联系人列表中选择一个人(使用联系人选择器),然后将此人的事件条目(出生日期)添加到联系人表格。

第1步:

我已经在清单文件中设置了权限:

<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>

第2步:

联系人选择器的ID已定义:

private static final int CONTACT_PICKER_ID = 123;

第3步:

联系人选择器被称为:

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(contactPickerIntent, CONTACT_PICKER_ID);

第4步:

另一种方法侦听联系人选择器的结果并尝试为所选用户添加事件:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {  
        switch (requestCode) {  
            case CONTACT_PICKER_ID:
                Uri selectedPerson = data.getData();
                String contactId = selectedPerson.getLastPathSegment();
                // ADD A NEW EVENT FOR THE SELECTED CONTACT --- BEGIN
                ContentValues values = new ContentValues();
                values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE);
                values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
                values.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY);
                values.put(ContactsContract.CommonDataKinds.Event.RAW_CONTACT_ID, contactId);
                values.put(ContactsContract.CommonDataKinds.Event.LABEL, "");
                values.put(ContactsContract.CommonDataKinds.Event.START_DATE, "2010-01-28"); // hard-coded date of birth
                Uri created = null;
                try {
                    created = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
                }
                catch (Exception e) {
                }
                if (created == null) {
                    Toast.makeText(this.getApplicationContext(), "Failed inserting the event!", Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(this.getApplicationContext(), "Successfully inserted the event!", Toast.LENGTH_SHORT).show();
                }
                // ADD A NEW EVENT FOR THE SELECTED CONTACT --- END
            break;
        }
    }
}

该事件已成功插入数据库并显示在Google通讯录中 - 但不幸的是,它被分配给了错误的联系人。为什么会这样?我从联系人选择器那里得到的 contactId 是错误的吗?

3 个答案:

答案 0 :(得分:2)

您从联系人选择器返回的活动结果是联系人的完整路径。类似的东西:

content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7

这就是你的内容:

Uri selectedPerson = data.getData();

这包含联系人的LOOKUP_KEY和联系人的_ID。但是,在插入Data表时需要使用RawContacts _ID。你需要做的是抓住RawContact的_ID:

long rawContactId = -1;
Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,
      new String[]{RawContacts._ID},
      RawContacts.CONTACT_ID + "=?",
      new String[]{String.valueOf(contactId)}, null);
try {
    if (c.moveToFirst()) {
        rawContactId = c.getLong(0);
    }
} finally {
    c.close();
}

然后使用rawContactId

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);

但是,应该注意每个联系人可以有多个RawContacts。您可能需要调整代码,以便为每个RawContact添加事件。

答案 1 :(得分:1)

您的内容值中有一个条目有误。您在onActivityResult数据变量中获得的Uri不是raw_contact_id,而是联系人ID。两者之间的区别在于一个联系人可以包含多个原始联系人。原始联系人与Google或Facebook等单个帐户相关联。但是联系人可以包含多个raw_contacts。

            Uri selectedPerson = data.getData();
            String contactId = selectedPerson.getLastPathSegment();
            // ADD A NEW EVENT FOR THE SELECTED CONTACT --- BEGIN
            ContentValues values = new ContentValues();
            values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE);
            ***values.put(ContactsContract.Data.CONTACT_ID, contactId);***
            values.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY);
            values.put(ContactsContract.CommonDataKinds.Event.RAW_CONTACT_ID, contactId);
            values.put(ContactsContract.CommonDataKinds.Event.LABEL, "");
            values.put(ContactsContract.CommonDataKinds.Event.START_DATE, "2010-01-28"); // hard-coded date of birth

答案 2 :(得分:0)

尝试切换......

Uri created = null;
try {
     created = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
}catch (Exception e) {
}
            if (created == null) {
                Toast.makeText(this.getApplicationContext(), "Failed inserting the event!", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(this.getApplicationContext(), "Successfully inserted the event!", Toast.LENGTH_SHORT).show();
            }

为...

try{
    Uri created = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
    if (created == null) {
         Toast.makeText(this.getApplicationContext(), "Failed inserting the event!", Toast.LENGTH_SHORT).show();
    }else{
         Toast.makeText(this.getApplicationContext(), "Successfully inserted the event!", Toast.LENGTH_SHORT).show();
    }
}catch (Exception e) {}