У меня есть действие по выбору и сохранению изображения профиля. Существует представление изображения и кнопка, которая запускает действие галереи для результата, ожидая пользователя, чтобы выбрать изображение. Когда галерея закрыта, выполняется следующий код:Сохраненное растровое изображение в android составляет 3 байта при чтении
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ((resultCode == RESULT_OK) && (requestCode == SELECT_PHOTO)) {
Uri selectedImage = data.getData();
try {
Bitmap image = this.decodeAndScaleImage(selectedImage, 285);
imgInsertPicture.setImageBitmap(image);
this.imagePresent = true;
this.saveMyProfilePicture(image);
this.popImageView();
} catch (IOException e) {
e.printStackTrace();
showToast(R.string.error_saving_picture);
}
}
}
private void saveMyProfilePicture(Bitmap picture) throws IOException {
FileOutputStream outputStream = openFileOutput(Globals.MY_PICTURE_FILE_NAME, MODE_PRIVATE);
picture.compress(Globals.MY_PICTURE_FORMAT, 90, outputStream);
outputStream.close();
ByteArrayOutputStream rawOutputStream = new ByteArrayOutputStream();
picture.compress(Globals.MY_PICTURE_FORMAT, 90, rawOutputStream);
byte[] rawPictureData = rawOutputStream.toByteArray();
rawOutputStream.close();
byte[] base64PictureData = Base64.encode(rawPictureData, Base64.DEFAULT);
rawPictureData = null;
FileOutputStream base64OutputStream = openFileOutput(Globals.MY_PICTURE_B64_FILE_NAME, MODE_PRIVATE);
base64OutputStream.write(base64PictureData);
base64OutputStream.close();
}
Я отлажена этот код и проверить, что: - не исключение не генерируется; - записанные файлы содержат точный объем данных (17 КБ для jpg-изображения, 24 кБ для версии base64); - произведенное растровое изображение является тем, которое я ожидаю, и отображается правильно на изображении.
popImageView предназначен только для того, и decodeAndScale работает только с растровыми данными в памяти и ничего не сохраняет.
Однако, когда я пытаюсь обновить текущую картину, когда начинается деятельность, изображение отображается пустое и JPEG файл COnly содержит 3 байта:
@Override
public void onStart() {
super.onStart();
if (!imagePresent && pictureExists()) {
File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME);
imgInsertPicture.setImageURI(Uri.fromFile(pictureFile));
popImageView();
imagePresent = true;
}
}
Здесь pictureExists проверяет, что имя файла содержится в коллекция возвращена listFiles(). pictureFile.exists() возвращает true, но, как я уже сказал, он содержит 3 байта. Я также пытался использовать BitmapFactory.decodeX, но так как файл был сломан, это было бесполезно.
Я не могу понять, почему. Я проверил, что файл был написан полностью, а затем он исчезает ... Когда я отлаживал свой Nexus S, код работал нормально, но затем я переключился на Nexus 5 и сломался.
Если файл читается правильно, а затем считается усеченным, то что-то перезаписывает ваш файл. Один из подходов к отладке заключается в том, чтобы добавить «насколько велик он сейчас» в разных точках вашей программы или выполнить шаг с отладчиком, когда вы делаете частые «ls -l» из оболочки adb, чтобы убедиться, что файл по-прежнему неповрежден. В какой-то момент размер изменится, и вы можете сузить его оттуда. – fadden
Я сделал это: размер отличается только при чтении в методе onStart, когда он вызывается в первый раз. – Totem
Значит, размер неправильный в onStart(), но размер по-прежнему остается правильным при просмотре из оболочки adb? Или ваша функция чтения неправильно считывает длину файла? Или вы говорите, что акт запуска активности обрезает файл? Если вы поставили точку останова в записи метода onStart(), то файл уже усечен тогда? Как запускается эта активность - делает ли все, что она знает об этом файле? Где хранится файл? Что еще имеет к нему доступ? – fadden