Сохраненное растровое изображение в 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(); } 

Я отлаживал этот код и проверял, что: – исключено исключение; – записанные файлы содержат точный объем данных (17kB для jpg-изображения, 24kB для версии base64); – созданное растровое изображение является тем, которое я ожидаю, и отображается правильно в представлении изображения.

PopImageView используется только для того, чтобы поднять представление изображения поверх других представлений, которые были спереди, прежде чем было выбрано изображение; И decodeAndScale работает только с растровыми данными в памяти и ничего не сохраняет.

Однако, когда я пытаюсь перезагрузить текущее изображение при запуске, изображение отображается пустым, а файл jpeg-файла содержит 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, и он сломался.

Solutions Collecting From Web of "Сохраненное растровое изображение в android составляет 3 байта при чтении"

Вы пробовали декодировать файл в растровое изображение с помощью BitmapFactory?

http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String)

Не тестировали следующий код, но можете ли вы попробовать:

 File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME); Bitmap bitmapImage = BitmapFactory.decodeFile(Uri.fromFile(pictureFile)); imgInsertPicture.setImageBitmap(bitmapImage); popImageView(); imagePresent = true; 

Попробуйте это в своем onActivityResult

  Uri selectedImage = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getActivity().getContentResolver().query( selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); selectedImagePath =filePath; 

Затем используйте selectedImagePath как путь к файлу.

Надеюсь, поможет.