I have a problem when I want to insert a photo for a contact. I want to insert a โparentโ contact image that does not have an image.
I just want to change the photo of the contact, not the raw contact (contact_id)
It just works for updating, but not for inserting, what's wrong? Photography is not recorded in content providers.
//UPDATE if (contact.getPhotoURL() != null){ ops.add(ContentProviderOperation .newUpdate(Data.CONTENT_URI) .withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[] { String.valueOf(contact.getId()), ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, baos.toByteArray()) .build()); }else{ //INSERT ops.add(ContentProviderOperation .newInsert(Data.CONTENT_URI) .withValue(ContactsContract.Data.CONTACT_ID, contact.getId()) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, baos.toByteArray()) .build()); }
thanks
EDIT: this following code works
ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, baos); ContentResolver c = ctx.getContentResolver(); ContentValues values = new ContentValues(); int photoRow = -1; String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + personId + " AND " + ContactsContract.Data.MIMETYPE + "=='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; Cursor cursor = c.query(ContactsContract.Data.CONTENT_URI, null, where, null, null); int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID); if (cursor.moveToFirst()) { photoRow = cursor.getInt(idIdx); } cursor.close(); values.put(ContactsContract.Data.RAW_CONTACT_ID, personId); values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, baos.toByteArray()); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); if (photoRow >= 0) { c.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null); } else { c.insert(ContactsContract.Data.CONTENT_URI, values); }
The IS_SUPER_PRIMARY field corrects the problem; the photo is saved for a "global" contact, and not just for a specific raw_contact.
Sincerely.