Add event for contact into Android39s contact table

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

  I ve worked hard on the following code, but unfortunately, the entry is assigned to the wrong contact. I don t know why. Tested for hours days but can t find the mistake. Can you help me?   

I would like to use the code in order to select a person from the contact list (using the contact picker) and then adding an event entry (date of birth) for this person to the contacts table.

  Step 1:   

I ve already set the permission in the manifest file:

<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
  Step 2:   

The contact picker s ID is defined:

private static final int CONTACT_PICKER_ID = 123;
  Step 3:   

The contact picker is called:

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(contactPickerIntent, CONTACT_PICKER_ID);
  Step 4:   

Another method listens for the contact picker s result and tries to add an event for the selected user:

@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;
        }
    }
}

The event is successfully inserted to the database and also shown in the Google contacts - but unfortunately it s assigned to the wrong contact. Why is this so? Is my contactId wrong that I get from the contact picker?

Answers

The activity result that you get back from the contact picker is the full path to the contact. Something like:

content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7

This is what s in your:

Uri selectedPerson = data.getData();

This contains both the Contact s LOOKUP_KEY AND the Contact s _ID. However, you need to be using the RawContacts _ID when inserting into the Data table. What you need to do is grab the RawContact s _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();
}

And then use the rawContactId:

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);

However, it should be noted that there can be multiple RawContacts per one Contact. You may want to adjust your code so that it adds an event for each RawContact.

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/9026121/add-event-for-contact-into-androids-contact-table

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils