Почему я получаю java.io.IOException: Марк был признан недействительным?

Я пытаюсь загрузить imags из url, а затем расшифровать их. Проблема в том, что я не знаю, насколько они велики, и если я их сразу декодирую, приложение выйдет со слишком большими изображениями.

Я делаю следующее, и он работает с большинством изображений, но с некоторыми из них он выдает java.io.IOException: Mark has been invalidated . Это не вопрос размера, потому что это происходит с 75 КБ или 120 КБ изображений, а не с 20 МБ или 45 КБ изображений. Также формат не важен, так как это может произойти либо с jpg, либо с png-изображением.

pisInputStream .

  Options opts = new BitmapFactory.Options(); BufferedInputStream bis = new BufferedInputStream(pis); bis.mark(1024 * 1024); opts.inJustDecodeBounds = true; Bitmap bmImg=BitmapFactory.decodeStream(bis,null,opts); Log.e("optwidth",opts.outWidth+""); try { bis.reset(); opts.inJustDecodeBounds = false; int ratio = opts.outWidth/800; Log.e("ratio",String.valueOf(ratio)); if (opts.outWidth>=800)opts.inSampleSize = ratio; return BitmapFactory.decodeStream(bis,null,opts); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } 

Я думаю, вы хотите декодировать большое изображение. Я сделал это, выбрав изображение галереи.

 File photos= new File("imageFilePath that you select"); Bitmap b = decodeFile(photos); 

Функция decodeFile (фотографии) используется для декодирования большого изображения. Я думаю, вам нужно получить изображение .png или .jpg formet.

  private Bitmap decodeFile(File f){ try { //decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f),null,o); //Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE=70; int width_tmp=o.outWidth, height_tmp=o.outHeight; int scale=1; while(true){ if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) break; width_tmp/=2; height_tmp/=2; scale++; } //decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize=scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) {} return null; } в  private Bitmap decodeFile(File f){ try { //decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f),null,o); //Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE=70; int width_tmp=o.outWidth, height_tmp=o.outHeight; int scale=1; while(true){ if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) break; width_tmp/=2; height_tmp/=2; scale++; } //decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize=scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) {} return null; } 

Вы можете отобразить его с помощью imageView.

 ImageView img = (ImageView)findViewById(R.id.sdcardimage); img.setImageBitmap(b);