为什么在这种情况下更新联系人照片不起作用?
How come updating the contact photo doesn't work in this case?
背景
我想更改通讯录中特定联系人的照片。
问题
我对联系人进行了一些查询,例如:
final Cursor phonesCursor = context.getContentResolver()
.query(ContactsContract.Data.CONTENT_URI,null,null,null,null);
然后,在遍历光标的循环内,我尝试更新第一个联系人的照片:
if (phonesCursor != null) {
while (phonesCursor.moveToNext()) {
final int rawContactId = phonesCursor.getInt(phonesCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID));
final String phoneNumber = phonesCursor.getString(phonesCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String name = phonesCursor.getString(phonesCursor.getColumnIndex(Phone.DISPLAY_NAME));
phonesMap.put(rawContactId, phoneNumber);
Log.d("AppLog", "trying to set image for " + name);
int photoRow = phonesCursor.getInt(phonesCursor.getColumnIndex(Phone._ID));
phonesCursor.close();
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
ByteArrayOutputStream streamy = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, streamy);
byte[] photo = streamy.toByteArray();
final ContentValues values = new ContentValues();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
final int update = context.getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
Log.d("AppLog", "update result:" + update);
break;
}
}
事实是,结果是"update" returns“1”,所以应该是成功的,但是当我转到联系人时,我没有看到这张照片。
我试过的
我尝试使用批处理(使用 ArrayList 和 getContentResolver().applyBatch ),但它也没有用。
我还尝试更改更新调用,以识别我希望以不同方式更改的项目(改为使用 RAW_CONTACT_ID)。也没用。
问题
怎么会这样?我应该怎么做才能解决这个问题?
用新照片更新多个联系人的最佳方式是什么?
是否也可以使用我的查询获取联系人的照片,而无需额外的查询?我想这样做是为了亲眼看看以前的联系方式不同。
好的,要使用的正确字段是 "LOOKUP_KEY" :
int lookupKeyIdx = phonesCursor.getColumnIndex(Phone.LOOKUP_KEY);
final String lookupKey = phonesCursor.getString(lookupKeyIdx);
...
final int update = context.getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, Phone.LOOKUP_KEY + " = " + lookupKey , null);
背景
我想更改通讯录中特定联系人的照片。
问题
我对联系人进行了一些查询,例如:
final Cursor phonesCursor = context.getContentResolver()
.query(ContactsContract.Data.CONTENT_URI,null,null,null,null);
然后,在遍历光标的循环内,我尝试更新第一个联系人的照片:
if (phonesCursor != null) {
while (phonesCursor.moveToNext()) {
final int rawContactId = phonesCursor.getInt(phonesCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID));
final String phoneNumber = phonesCursor.getString(phonesCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String name = phonesCursor.getString(phonesCursor.getColumnIndex(Phone.DISPLAY_NAME));
phonesMap.put(rawContactId, phoneNumber);
Log.d("AppLog", "trying to set image for " + name);
int photoRow = phonesCursor.getInt(phonesCursor.getColumnIndex(Phone._ID));
phonesCursor.close();
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
ByteArrayOutputStream streamy = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, streamy);
byte[] photo = streamy.toByteArray();
final ContentValues values = new ContentValues();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
final int update = context.getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
Log.d("AppLog", "update result:" + update);
break;
}
}
事实是,结果是"update" returns“1”,所以应该是成功的,但是当我转到联系人时,我没有看到这张照片。
我试过的
我尝试使用批处理(使用 ArrayList 和 getContentResolver().applyBatch ),但它也没有用。
我还尝试更改更新调用,以识别我希望以不同方式更改的项目(改为使用 RAW_CONTACT_ID)。也没用。
问题
怎么会这样?我应该怎么做才能解决这个问题?
用新照片更新多个联系人的最佳方式是什么?
是否也可以使用我的查询获取联系人的照片,而无需额外的查询?我想这样做是为了亲眼看看以前的联系方式不同。
好的,要使用的正确字段是 "LOOKUP_KEY" :
int lookupKeyIdx = phonesCursor.getColumnIndex(Phone.LOOKUP_KEY);
final String lookupKey = phonesCursor.getString(lookupKeyIdx);
...
final int update = context.getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, Phone.LOOKUP_KEY + " = " + lookupKey , null);