通过联系人选择器向Android中的ContactsContract.CommonDataTypes.event添加事件

通过联系人选择器向Android中的ContactsContract.CommonDataTypes.event添加事件,android,events,android-contacts,contactscontract,Android,Events,Android Contacts,Contactscontract,在我的Android应用程序的一个活动中,我想打开内容选择器。当用户选择其中一个联系人时,应该有一个新条目(类型为“其他”的事件)插入到表contacts contract.commonDataTypes.event中 启动触点选择器很容易。但是,必须为所选联系人获取一些数据,并在事件表中创建一个新条目。这是我到目前为止的代码,不幸的是它不起作用: @Override protected void onActivityResult(int requestCode, int resultCode,

在我的Android应用程序的一个活动中,我想打开内容选择器。当用户选择其中一个联系人时,应该有一个新条目(类型为“其他”的事件)插入到表contacts contract.commonDataTypes.event中

启动触点选择器很容易。但是,必须为所选联系人获取一些数据,并在事件表中创建一个新条目。这是我到目前为止的代码,不幸的是它不起作用:

@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 contactData = data.getData();
            //String contactID = contactData.getLastPathSegment();
            // ADD A NEW BIRTHDAY FOR THE SELECTED CONTACT START
            ContentValues values = new ContentValues();
            values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE);
            values.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_OTHER);
            values.put(ContactsContract.CommonDataKinds.Event.CONTACT_ID, 250);
            values.put(ContactsContract.CommonDataKinds.Event.START_DATE, "2012-12-12");
            Uri dataUri = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
            // ADD A NEW BIRTHDAY FOR THE SELECTED CONTACT END
            break;
        }
    }
}
此代码需要“写入联系人”权限

联系人ID“250”是硬编码的。当然,它应该从与联系人选取器结果一起发送的意图数据中检索

上面的代码以NullPointerException终止。为什么会这样?如何从intent中获取联系人的id,以便插入新行

编辑:此外,该行

getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

。。。抛出异常。有什么问题吗?

下面是如何做的,假设您这样称呼联系人选择器:

int CONTACT_PICKER_ID = 1001; //some arbitrary number that you choose
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivity(intent, CONTACT_PICKER_ID);
getData()调用返回一个查找键,您必须查询contacts DB以查找该联系人的ID

if (resultCode == RESULT_OK) {  
    switch (requestCode) {  
        case CONTACT_PICKER_ID:  
            Cursor cursor =  managedQuery(data.getData(), null, null, null, null);
            cursor.moveToFirst();
            //get the contact's ID
            contactId = Cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));

...

contactId包含您想要的ID。

谢谢!这很好:)但实际上,我需要“Contacts contract.Data.CONTACT\u ID”而不是“Contacts contract.Contacts.\u ID”。我怎样才能得到这个专栏?当我在代码中尝试此操作时,出现了一个异常,因为getColumnIndex返回-1。我认为这些ID是相同的。ContactsContract.Data.CONTACT\u ID似乎是对ContactsContract.Contacts的引用。根据此javadoc的ID:。出现错误的原因是CONTACT_ID不是游标返回的行中的列。