2012-01-26 251 views
0

我在以下代碼中努力工作,但不幸的是,該條目被分配給錯誤的聯繫人。我不知道爲什麼。測試 小時 天但無法找到該錯誤。你可以幫我嗎?將聯繫人的事件添加到Android的聯繫人表

我想要使用代碼來從聯繫人列表中選擇一個人(使用聯繫人選擇器),然後將此人的事件條目(出生日期)添加到聯繫人表中。

步驟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

我不是一個Android專家,但是您是否需要能夠讀取聯繫人以選擇一個以及寫入功能? – Jared

+0

每個http://developer.android.com/reference/android/Manifest.permission.html WRITE_CONTACTS沒有能力讀取它們。我再也不知道答案,這只是我看不起的東西。 – Jared

+0

對不起,權限READ_CONTACTS也被設置。但是閱讀過程不是問題,無論如何。這是寫作不起作用。 – caw

回答

2

您從聯繫人選擇器返回的活動結果是聯繫人的完整路徑。喜歡的東西:

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

但是,應該指出的是,可以有每接觸多個RawContacts。您可能需要調整代碼,以便爲每個RawContact添加一個事件。

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

謝謝!不幸的是,這並沒有改變任何東西,爲什麼它應該這樣做呢?getContentResolver()。insert()行拋出異常 - so它現在仍然被「抓住」/抓住了幾個步驟,但問題在於,insert()會拋出這個異常,也許插入的內容是錯誤的(錯誤的URI,錯誤的鍵值對) – caw

+0

@MarcoW我試着去看那個,不管出於什麼原因,我看到了一些我認爲可能會導致這種改變的東西,我不能爲了我的生活而記住它是什麼,我會把它放在評論中,但是SO不會在評論中沒有很好的支持代碼量 – Jared

+0

:D沒關係,再次感謝您的意願:) – caw

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 
+0

感謝您的建議,但它不起作用,實際上:(使用您的代碼insert()再次返回「null」顯示吐司「Failed ...」。當我註釋掉你的新行「values.put(ContactsContract.Data.CONTACT_ID,contactId)」時,insert()返回一個有效的URI。 – caw