Добавить событие для контакта в таблицу контактов Android - PullRequest
0 голосов
/ 27 января 2012

Я много работал над следующим кодом, но, к сожалению, запись назначена не тому контакту. Я не знаю почему. Проверено на часов дней, но не может найти ошибку. Вы можете мне помочь?

Я хотел бы использовать код, чтобы выбрать человека из списка контактов (используя средство выбора контактов), а затем добавить запись о событии (дата рождения) для этого человека в таблицу контактов.

Шаг 1:

Я уже установил разрешение в файле манифеста:

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

Шаг 2:

Идентификатор сборщика контактов определен:

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 неправильным, что я получаю из средства выбора контактов?

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Результатом действия, которое вы получаете от средства выбора контактов, является полный путь к контакту. Что-то вроде:

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

Это то, что в вашем:

Uri selectedPerson = data.getData();

Содержит как LOOKUP_KEY, так и _ID контакта. Однако при вставке в таблицу данных необходимо использовать _ID RawContacts. Что вам нужно сделать, это получить _ID:

RawContact
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.

1 голос
/ 29 января 2012

Одна запись неверна в ваших значениях контента. Uri, который вы получаете в переменной данных onActivityResult, - это не raw_contact_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 голосов
/ 29 января 2012

попробуйте переключиться ...

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) {}
...