2012-01-12 138 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