Android - 无法使用Movie类加载gif文件

时间:2011-05-15 01:06:55

标签: android gif android-sdcard

我正在尝试使用android.graphics.Movie播放来自/sdcard/download的GIF文件。

如果我将文件放在APK的drawable文件夹中,我可以使用以下方式加载:

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

有效。 movie.duration()将显示正确的持续时间,我用它来获取movie.setTime()的值。

如果我尝试使用

从SD卡加载,而不是drawable,则会出现问题
String path = Environment.getExternalStorageDirectory() + "/download/animfile.gif";
Movie movie = Movie.decodeFile(path);

似乎加载某些内容,因为movie不为空。但问题是movie.duration()会返回0

知道为什么会这样,以及我应该做什么?

3 个答案:

答案 0 :(得分:3)

我也碰到了这个。经过多次试验和错误后,我使用getContentResolver()。openInputStream和android BitmapDecode example中的dead streamToBytes代码使其工作,这似乎有效。我还没有找到解释为什么需要对包资源和sd文件进行不同的处理。

示例:

...
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();
}

答案 1 :(得分:2)

你是对的,除了一个。您不应该使用Uri和ContentResolver。简短的解决方案是你应该使用

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

而不是

Movie.decodeFile(path);

线索是在decodeFile(path)方法中创建的某些流的reset()方法实现。

答案 2 :(得分: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();
            }