gpt4 book ai didi

android - 在 ContactsContract 中更新照片的函数

转载 作者:行者123 更新时间:2023-11-30 00:13:49 28 4
gpt4 key购买 nike

我尝试使用获取联系人 ID 和图片 URI 的函数更新 ContactsContract 中的照片,但它似乎不起作用(我的函数返回 true)。

我真的不明白,因为代码看起来不错。

当联系人已经有照片时,它似乎正在工作......

这是我的功能:

boolean updatePhoto(String idStr, String uri){
if (uri != null) {
ArrayList<ContentProviderOperation> ops = new ArrayList<>();

File imgFile = new File(uri.replace("file://", ""));
if (imgFile.exists()) {

Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream);
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data.CONTACT_ID + " = ?" + " AND " + ContactsContract.Data.MIMETYPE + "=?",
new String[]{idStr, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, stream.toByteArray())
.build());

try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch(Exception e) {
e.printStackTrace();
return false;
}
}
}
return true;
}

最佳答案

您的代码仅在联系人已有照片时有效,因为您使用的是 ContentProviderOperation.newUpdate,如果联系人没有照片,您需要使用 ContentProviderOperation.newInsert.

需要先查询联系人是否有照片,然后更新/插入新照片:

private boolean hasPhoto(long contactId) {
Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
InputStream input = Contacts.openContactPhotoInputStream(getContentResolver(), uri);
if (input == null) {
return false;
}
Bitmap photo = BitmapFactory.decodeStream(input);
return (photo != null);
}

private long getRawId(long contactId) {
String selection = RawContacts.CONTACT_ID + "='" + contactId + "'";
Cursor cur = contentResolver.query(RawContacts.CONTENT_URI, new String[]{ RawContacts._ID }, selection, null, null);
try {
if (cur.moveToNext()) {
return cur.getLong(0);
}
} finally {
cur.close();
}
return 0;
}

private boolean updatePhoto(long contactId, String uri) {
if (uri == null) {
// do nothing?
return false;
}

ContentProviderOperation.Builder builder;
if (hasPhoto(contactId)) {
builder = ContentProviderOperation.newUpdate(Data.CONTENT_URI);
builder.withSelection(Data.CONTACT_ID + " = ?" + " AND " + Data.MIMETYPE + "=?",
new String[]{ String.valueOf(contactId), Photo.CONTENT_ITEM_TYPE});
} else {
long rawId = getRawId(contactId);
builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
builder.withValue(Data.RAW_CONTACT_ID, rawId);
}

builder.withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
builder.withValue(Data.IS_SUPER_PRIMARY, 1);
builder.withValue(Data.IS_PRIMARY, 1);

byte[] photo = getPhotoAsByteArray(uri); // to simplify the answer's code
builder.withValue(Photo.PHOTO, photo);

try {
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(builder.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch(Exception e) {
e.printStackTrace();
return false;
}
return true;
}

关于android - 在 ContactsContract 中更新照片的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47657912/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com