2012-01-12 139 views
3

在我的Android应用程序的活动中,我想打开内容选择器。当用户选择其中一个联系人时,应该有一个新条目(类型为“其他”的事件)插入表ContactsContract.CommonDataKinds.Event在Android中通过联系人选择器向Android中的ContactsContract.CommonDataKinds.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; 
     } 
    } 
} 

此代码需要权限“WRITE_CONTACTS”。

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

上述代码以NullPointerException终止。这是为什么?如何从意图中获得联系人的ID,以便我可以使用它来插入新行?

编辑:此外,该行...

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

...抛出异常。那里有什么问题?

回答

0

这里是如何做到这一点,假设你这是怎么叫的联系人挑选:

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); 

的data.getData()调用返回你要查询的联系人数据库为找到一个查找键联系人的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。

+0

谢谢!这工作正常:)但实际上,我需要“ContactsContract.Data.CONTACT_ID”,而不是“ContactsContract.Contacts._ID”。我怎样才能得到这个专栏?当我用你的代码尝试这个时,有一个异常,因为getColumnIndex返回-1。 – caw 2012-01-14 14:19:14

+0

我认为这些ID是相同的。 ContactsContract.Data.CONTACT_ID似乎是根据此javadoc对ContactsContract.Contacts._ID的引用:http://developer.android.com/reference/android/provider/ContactsContract.RawContactsColumns.html#CONTACT_ID。您收到错误的原因是因为CONTACT_ID不是游标中返回的行中的列。 – robertly 2012-01-17 19:27:55