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

aph*_*aph 5 android gif android-sdcard

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

如果我把文件放在drawableAPK 的文件夹中,我可以使用以下命令加载它:

InputStream istr = context.getResources().openRawResource(R.drawable.animfile);
Movie movie = Movie.decodeStream(istr);
Run Code Online (Sandbox Code Playgroud)

这样可行.movie.duration()将显示正确的持续时间,我用它来获取值movie.setTime().

如果我尝试从SD卡加载它而不是可绘制,则会出现问题

String path = Environment.getExternalStorageDirectory() + "/download/animfile.gif";
Movie movie = Movie.decodeFile(path);
Run Code Online (Sandbox Code Playgroud)

这似乎加载的东西movie不为空.但问题是movie.duration()回报0.

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

小智 3

我也遇到了这个。经过多次尝试和错误后,我使用 getContentResolver().openInputStream 和 android BitmapDecode 示例中的死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();
}
Run Code Online (Sandbox Code Playgroud)