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.
- Obtener excepción IO al crear un archivo en Android?
- Qué hacer con una IOException en WebViewClient.shouldInterceptRequest ()
- Obtener el código de respuesta de HttpURLConnection en android
- ¿Qué causa la herramienta jobb para lanzar FAT IOException completa?
- Java.io.ioexception: open failed: einval (argumento no válido) al guardar una imagen en un almacenamiento externo
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"/>
- Android Bluetooth .conect () excepción Nexus 7 OBDII adaptador
- Xml extraer elementos del analizador xml
- IOException durante la lectura de InputStream
- SDK de Google Drive para OCR
- Nuevo error de origen desconocido del registro de la API de GCM
- Java: La excepción en sí es nula
- Java.io.IOException: Error ejecutando exec () Directorio de trabajo: null Medio ambiente: null
- MediaPlayer.setDataSource provoca IOException para archivo válido
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);
- Cómo implementar doble toque para vista de superficie en android
- Utilizar lista de matrices de objetos como adaptador de hiladora