IOException – No se puede cargar el archivo

Tengo una aplicación que muestra imágenes GIF. Todo funciona bien si la imagen se guarda en drawable , y lo accedo así

is=context.getResources().openRawResource(R.drawable.mygif); movie = Movie.decodeStream(is); 

Pero necesito descargar la imagen de Internet, así que la estoy guardando en CacheDir, que funciona bien. He intentado lo siguiente para leerlo.

  try { is = new BufferedInputStream(new FileInputStream(new File(context.getCacheDir(), "mygif.gif"))); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } movie = Movie.decodeStream(is); 

Y esto

 movie = Movie.decodeFile(new File(context.getCacheDir(), "mygif.gif").getPath()); 

Pero pase lo que pase, termina con

 java.io.IOException at java.io.InputStream.reset(InputStream.java:218) at android.graphics.Movie.decodeStream(Native Method) at android.graphics.Movie.decodeTempStream(Movie.java:74) at android.graphics.Movie.decodeFile(Movie.java:59) 

o

 java.io.IOException: Mark has been invalidated. at java.io.BufferedInputStream.reset(BufferedInputStream.java:350) at android.graphics.Movie.decodeStream(Native Method) 

Creo que es un error muy simple, pero no puedo superarlo. Manifiesto tiene:

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

sugerencia:

1.try mueve la ubicación de descarga a otra carpeta como: sdcard , o la aplicación otra carpeta excepto la cache .

2.when init el inputstream , intento use: init con un tamaño del almacenador intermediario

 int buffersize = 16*1024; InputStream is = new BufferedInputStream(xxx,buffersize); 

3.para comprobar el archivo existió en su carpeta

Actualizar: cambiar el código como este y no utilizar Movie.decodeFile

  InputStream is = null; try { is = new BufferedInputStream(new FileInputStream(new File(getCacheDir(), "mygif.gif")), 16 * 1024); is.mark(16 * 1024); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } movie = Movie.decodeStream(is); 

Sin lanzamiento de excepción, y la movie no es nula.

Además, aunque su código arroje la excepción, la movie también no es nula.

Sé que es un puesto muy antiguo, pero yo estaba teniendo el mismo problema

Copiar el InputStream a una matriz de bytes y llamar a Movie.decodeByteArray funcionó para mí, incluso en dispositivos Samsung

Mi respuesta se basa en la respuesta de BeNeXuS.

Es posible que el tamaño del archivo no siempre se conozca; consulte:

 File file = ...; InputStream inputStream = new FileInputStream(file); 

o

 InputStream inputStream = getContext().getContentResolver().openInputStream(uri); 

Después de obtener el inputStream:

 BufferedInputStream bis = new BufferedInputStream(inputStream); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte buffer[] = new byte[1024]; int len; while ((len = bis.read(buffer, 0, buffer.length)) > 0) { baos.write(buffer, 0, len); } bis.close(); byte[] imageData = baos.toByteArray(); baos.close(); Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); 

Android hasta 4.4 no puede decodificar Película de Archivo y Stream en caso de IOException interna en el método InputStream.reset (). Pero la decodificación de bytes funciona bien en todas las versiones de Android. Aquí hay una versión mínima del código para hacer esto:

 int size = (int) imageFile.length(); byte[] buffer = new byte[size]; FileInputStream inputStream = new FileInputStream(imageFile); int readLength = inputStream.read(buffer); inputStream.close(); Movie movie = Movie.decodeByteArray(buffer, 0, readLength); 
  • Java.io.IOException: No queda espacio en el dispositivo Android
  • HttpUrlConnection getOutputStream lanza IOException
  • Android: Nexus One - Geocoder causa IOException - funciona perfectamente con otros dispositivos y emuladores
  • IOException en aceptar subproceso
  • Android Exception: java.io.IOException: open failed: EACCES (permiso denegado)
  • Java.io.IOException: ¡No se puede abrir la conexión de sincronización! En el Nexus
  • Error del emulador de Android -ddmlib error
  • ¿Existe un límite para el número de archivos en un directorio de una tarjeta SD?
  • BufferedInputStream o FileInputStream IOException
  • Android reproducir archivos de recursos desde el almacenamiento interno provoca que MediaPlayer.prepare dé IOException
  • Solicitud de excepción de Android en IOException al recuperar JSON de URL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.