2011-05-15 12 views
5

Estoy tratando de usar android.graphics.Movie para reproducir un archivo GIF desde /sdcard/download.Android - Error al cargar el archivo .gif usando la clase de película

Si pongo el archivo en la carpeta drawable en el APK, puedo cargarlo usando:

InputStream istr = context.getResources().openRawResource(R.drawable.animfile); 
Movie movie = Movie.decodeStream(istr); 

que funciona. movie.duration() mostrará la duración correcta, que utilizo para derivar el valor de movie.setTime().

El problema ocurre si, en lugar de dibujable, trato de cargarlo desde la tarjeta SD usando

String path = Environment.getExternalStorageDirectory() + "/download/animfile.gif"; 
Movie movie = Movie.decodeFile(path); 

Parece que cargar algo como movie no es nulo. Pero el problema es que movie.duration() devuelve 0.

¿Alguna idea de por qué sucede esto y qué debería hacer?

Respuesta

3

Me encontré con esto también. Después de mucha prueba y error, lo hice funcionar usando getContentResolver(). OpenInputStream y el código de deadToBytes muerto en el android BitmapDecode example, que parece funcionar. Todavía no he encontrado una explicación sobre por qué esto debe hacerse de manera diferente para los recursos del paquete y los archivos sd.

ejemplo:

... 
Uri uri = Uri.parse(uriString); 
java.io.InputStream is; 
try { 
    is = context.getContentResolver().openInputStream(uri); 
} 
catch(Exception e) { 
} 
byte[] array = streamToBytes(is); 
Movie movie = Movie.decodeByteArray(array, 0, array.length); 


private static byte[] streamToBytes(InputStream is) { 
    ByteArrayOutputStream os = new ByteArrayOutputStream(1024); 
    byte[] buffer = new byte[1024]; 
    int len; 
    try { 
     while ((len = is.read(buffer)) >= 0) { 
      os.write(buffer, 0, len); 
     } 
    } catch (java.io.IOException e) { 
    } 
    return os.toByteArray(); 
} 
2

Tiene usted razón, excepto uno. No deberías usar Uri y ContentResolver. solución a corto es que se debe utilizar

Movie.decodeByteArray(array, 0, array.length) 

en lugar de

Movie.decodeFile(path); 

pista está en reset() implementación del método de alguna corriente que crea dentro del método decodeFile (ruta).

1
is = new FileInputStream(file path); 



       if (path != null) { 
          try { 
           byte[] array = streamToBytes(is); 
           mMovie = Movie.decodeByteArray(array, 0, array.length); 

           mDuration = mMovie.duration(); 
           Log.v("total time ", mDuration + ""); 
          } finally { 
           is.close(); 
          } 
         } else { 
          throw new IOException("Unable to open R.raw."); 
         } 


private byte[] streamToBytes(InputStream is) { 
       ByteArrayOutputStream os = new ByteArrayOutputStream(1024); 
       byte[] buffer = new byte[1024]; 
       int len; 
       try { 
        while ((len = is.read(buffer)) >= 0) { 
         os.write(buffer, 0, len); 
        } 
       } catch (java.io.IOException e) { 
       } 
       return os.toByteArray(); 
      } 
Cuestiones relacionadas