Добавить номер для контакта на Android 2.0

Я пытаюсь добавить номер телефона к уже существующему контакту на Droid-телефоне. Делать это одновременно с созданием контакта - тривиально, поскольку при создании ContentProviderOperation указанная мной обратная ссылка просто равна 0. Но попытка найти обратную ссылку с помощью запроса отображаемого имени не работает:

Cursor rawContactsReferenceCursor = 
            contentResolver.query(Data.CONTENT_URI, 
                    new String[]{Data.RAW_CONTACT_ID},
                    Data.DISPLAY_NAME+"=\""+displayName+"\"", null, null);

Хотя я получаю необработанный идентификатор контакта, следующий код просто генерирует IndexOutOfBoundException (rawConcactReferenceID - это переменная, которую я получил из предыдущего запроса):

ArrayList<ContentProviderOperation> op_list = 
    new ArrayList<ContentProviderOperation>();
op_list.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID, rawConcactReferenceID)
    .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
    .withValue(Phone.NUMBER, testNumber)
    .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
    .withValue(Phone.LABEL, testLabel)
    .build()); 
ContentProviderResult[] result =
    contentResolver.applyBatch(ContactsContract.AUTHORITY, op_list);

Большой проблемой является огромное отсутствие хорошей документации. Я был бы очень доволен, чтобы просто взять в руки рабочую копировальную пасту для изучения.

Ура,

3 ответа

Решение

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

ContentValues values = new ContentValues();
values.put(Data.RAW_CONTACT_ID, new Integer(contactId).intValue());
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, dataValue);
values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
values.put(Phone.LABEL, customLabel);
Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values);

У меня была похожая проблема с адресами электронной почты. Вот решение, которое я использовал, которое сработало:

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValue(Data.RAW_CONTACT_ID, id)
    .withValue(Email.DATA, value)
    .withValue(Email.MIMETYPE, .Email.CONTENT_ITEM_TYPE)
    .withValue(Email.LABEL, label)
    .withValue(Email.TYPE, Email.TYPE_CUSTOM)
    .build());
ContentProviderResult[] res = cr.applyBatch(ContactsContract.AUTHORITY, ops);

То же решение должно работать для телефонных номеров.

Другие вопросы по тегам