Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Загрузить изображение в GoogleDrive

#java #android


При загрузке изображения в google drive иногда он загружается нормально памяти хватает,
но иногда вываливает java.lang.OutOfMemoryError: Failed to allocate a 63489036 byte
allocation with 16777216 free bytes and 21MB until OOM
в коде я декодирую его в изображение переворачиваю изображение если надо будет, и
указываю content type и загружаю в Google Drive.
Ошибка выходит при декодировании изображения. Как можно это обойти, мне обязательно
нужно загружать изображение не обрезанное и полное.

BitmapFactory.Options bmOptions = new BitmapFactory.Options();
Bitmap  image = BitmapFactory.decodeFile(mSettings.getString(Const.directory, "")
+ "/" + file.getName(), bmOptions);
if (Picture.getCameraPhotoOrientation(file) !=0) {
    image = Picture.rotateBitmap(image, 270);
}
OutputStream outputStream = result.getDriveContents().getOutputStream();
ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, bitmapStream);
try {
    outputStream.write(bitmapStream.toByteArray());
} catch (IOException e1) {
    log(e1 + "");
}
MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder().setMimeType("image/jpeg").setTitle(file.getName()).build();
DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, DriveId.decodeFromString(stringFolderId));
folder.createFile(mGoogleApiClient, metadataChangeSet, driveContents).setResultCallback(fileCallback1);

    


Ответы

Ответ 1



Это известная проблема возникающая при декодировании битмапа из файла. Проблемная строка BitmapFactory.decodeFile() Чтобы ее решить, на старых версиях Android'а (до KitKat), достаточно было указывать битмап выгружаемым на диск: BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inPurgeable=true; Для новых версий - этот фокус уже не работает и приходится извращаться по другому, например: BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inPreferredConfig = Config.RGB_565; //отводит на пиксель 2 байта, вместо 4-х по умолчанию bmOptions.inDither = true; В итоге размер битмапа сокращается в 2 раза. Update Судя по логам у вас слишком большой размер битмапа (>60 мегов) - это очень много, явно больше разрешения девайса. Соответственно при декодировании я бы его смасштабировал, например так: bmOptions.inSampleSize=4; //уменьшит размеры в 4 раза то есть занимаемая память уменьшится в 16 раз, до 16 мегов. Если не поможет, то надо увеличивать до 5 или 6. Почитайте эту статейку

Ответ 2



Попробуйте использовать decodeStream(is, outPadding, opts) BitmapFactory.Options opts=new BitmapFactory.Options(); opts.inDither=false; opts.inPurgeable=true; opts.inInputShareable=true; opts.inTempStorage=new byte[32 * 1024];

Комментариев нет:

Отправить комментарий