Размер картинки контакта меняется при вставке и обновлении - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема при вставке или обновлении изображения контакта. Кажется, что Android сжал изображение.

Для тестирования я создал PNG с размером 200 x 200 пикселей и сохранил его во внутреннем хранилище приложения.

Размер байта [] равен 52490.

Но размер изображения контакта (высокое разрешение) всегда составляет 6767 байтов.

Проверено на HT C 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;
}

Вставьте картинку в конкретный c контакт:

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;

Я думаю, что делаю что-то не так, но у меня не знаю что.

1 Ответ

0 голосов
/ 19 июня 2020

Разве вам не нужно l oop читать в следующем коде:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...