2014-12-21 4 views
9

У меня есть действие по выбору и сохранению изображения профиля. Существует представление изображения и кнопка, которая запускает действие галереи для результата, ожидая пользователя, чтобы выбрать изображение. Когда галерея закрыта, выполняется следующий код:Сохраненное растровое изображение в 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 и сломался.

+0

Если файл читается правильно, а затем считается усеченным, то что-то перезаписывает ваш файл. Один из подходов к отладке заключается в том, чтобы добавить «насколько велик он сейчас» в разных точках вашей программы или выполнить шаг с отладчиком, когда вы делаете частые «ls -l» из оболочки adb, чтобы убедиться, что файл по-прежнему неповрежден. В какой-то момент размер изменится, и вы можете сузить его оттуда. – fadden

+0

Я сделал это: размер отличается только при чтении в методе onStart, когда он вызывается в первый раз. – Totem

+0

Значит, размер неправильный в onStart(), но размер по-прежнему остается правильным при просмотре из оболочки adb? Или ваша функция чтения неправильно считывает длину файла? Или вы говорите, что акт запуска активности обрезает файл? Если вы поставили точку останова в записи метода onStart(), то файл уже усечен тогда? Как запускается эта активность - делает ли все, что она знает об этом файле? Где хранится файл? Что еще имеет к нему доступ? – fadden

ответ

0

Вы пробовали декодировать файл в растровое изображение с использованием 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; 
+0

Уже пробовал, не работает. – Totem

0

Попробуйте это в 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 в качестве пути к файлу.

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

Смежные вопросы