2012-01-26 152 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