【问题标题】:Add event for contact into Android's contact table将联系人事件添加到 Android 的联系人表中
【发布时间】:2012-01-26 22:07:27
【问题描述】:

我一直在努力编写以下代码,但不幸的是,该条目分配给了错误的联系人。我不知道为什么。测试了 hours 天,但找不到错误。你能帮帮我吗?

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

第 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 是否有误?

【问题讨论】:

  • 无论如何我都不是安卓专家,但是你需要读取联系人来选择联系人的能力以及写入能力吗?
  • 根据developer.android.com/reference/android/… WRITE_CONTACTS 没有读取它们的能力。再说一次,我不知道答案,这只是让我望而却步的事情。
  • 抱歉,READ_CONTACTS 权限也设置了。但无论如何,阅读过程不是问题。是文案不行。
  • 只是检查一下,就像我说我不是 android 人,但喜欢阅读代码,这看起来像是“可能”导致问题的东西。
  • 好的,谢谢您的评论!我很感激,真的:) 我很高兴有人关注这个问题。每次尝试,都有机会发现错误:)

标签: android contacts android-contacts contactscontract


【解决方案1】:

您从联系人选取器返回的活动结果是联系人的完整路径。比如:

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

这是你的:

Uri selectedPerson = data.getData();

这包含联系人的 LOOKUP_KEY 和联系人的 _ID。但是,您需要在插入数据表时使用 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);

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

【讨论】:

    【解决方案2】:

    您的内容值中有一个条目错误。您在 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
    

    【讨论】:

    • 感谢您的建议,但实际上它不起作用:( 使用您的代码,insert() 再次返回“null”。因此显示了 toast“Failed ...”。当我注释掉你的新行“values.put(ContactsContract.Data.CONTACT_ID, contactId)”然后 insert() 返回一个有效的 URI。
    【解决方案3】:

    尝试切换...

    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) {}
    

    【讨论】:

    • 谢谢!不幸的是,这并没有改变任何东西。实际上,为什么要这样做?异常在 getContentResolver().insert() 行中引发 - 所以它现在仍然在几步之后被抛出错误的“捕获”/捕获。问题是 insert() 抛出了这个异常。可能插入的内容是错误的(错误的 URI,错误的键值对)。
    • @MarcoW。我试图查看它,无论出于何种原因,我看到了一些我认为可能会导致这改变的东西。我这辈子都不记得那是什么了。我会把它放在评论中,但 SO 对评论中的代码量没有很好的支持。
    • :D 没关系。再次感谢您的帮助:)
    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多