我在插入或更新联系人图片时遇到问题。 似乎Android压缩了图片。
为了进行测试,我创建了一个 200 x 200 像素的 PNG,并将其保存在内部应用程序存储中。
字节 [] 的大小为 52490。
但是联系人图片的大小(高分辨率(始终为 6767 字节。
在HTC U11(Android 9(和Sony Xperia(Android 8(上进行测试
从内部存储读取映像:
byte[] readPicture(String filename) {
FileInputStream in = null;
byte[] result = null;
try {
in = context.openFileInput(filename);
result = new byte[in.available()];
int read = in.read(result);
Log.d("FileUtil", read + " bytes read from " + filename);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeStream(in);
}
return result;
}
将图片插入特定联系人:
picture = readPicture(filename);
ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withYieldAllowed(true);
builder.withValue(ContactsContract.Data.CONTACT_ID, contactId);
builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, picture);
ops.add(builder.build());
加载全尺寸联系人图片:
// contact.getContactId() == ContactsContract.Data.CONTACT_ID
// contact.getLookup() == ContactsContract.Data.LOOKUP_KEY
ContactsContract.Contacts.getLookupUri(Long.parseLong(contact.getContactId()), contact.getLookup());
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri, true);
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] result = null;
if (is != null) {
byte[] buffer = new byte[4096];
int length;
try {
while ((length = is.read(buffer)) != -1) {
os.write(buffer, 0, length);
}
result = os.toByteArray();
} catch (Exception ignored) {
return null;
} finally {
FileUtil.closeStream(is);
FileUtil.closeStream(os);
}
}
return result;
我想我做错了什么,但我不知道是什么。
你不需要在下面的代码中循环读取吗:
while(in.available()>0){
result = new byte[in.available()];
int read = in.read(result);
//or better make a loop until in.read(readBytes[])!=-1
Log.d("FileUtil", read + " bytes read from " + filename);
}