我在以下代码上努力工作,但不幸的是,该条目被分配给了错误的联系人。我不知道为什么。经过小时天的测试,但找不到错误。你能帮帮我吗?
我想使用该代码从联系人列表中选择一个人(使用联系人选择器),然后将此人的事件条目(出生日期)添加到联系人表格。
第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 是错误的吗?
答案 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) {}