在自己去实现更新联系人头像是经常遇到更新联系人头像失败的问题
现象:联系人头像字段若已经存储头像数据可以正常更新,若当前修改的联系人头像不存在,则会出现更新失败的情况;
原因:当联系人已经存在联系人头像时,存储联系人头像二进制字段已经占位,即表示数据库中已经存在该条记录,
我们只需要调用getContentResolver().update()方法更新头像,若联系人头像不存在,用户新增头像需要调用
getContentResolver().insert方法插入头像; 实例参考代码:
String phoneWhere = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId; Cursor phoneCursor = mView.getCtx().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, phoneWhere , null, null); if(phoneCursor.moveToNext()){ Long photoId = phoneCursor.getLong(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_ID)); if(bm != null){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] data = baos.toByteArray(); //更新 if(photoId > 0){ values.clear(); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, data); // values.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); String wherebm = ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=? "; //rawContactsId -> contactId String[] selectionArgsbm = new String[]{rawContactsId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE}; int id = mView.getCtx().getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, wherebm, selectionArgsbm); }else{ //插入 //保存联系人头像 values.clear(); values.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactsId); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, data); values.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); mView.getCtx().getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values); } } }