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

标签 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

知道为什么会发生这种情况,我应该怎么做?

最佳答案

我也遇到过这个问题。经过多次试验和错误后,我使用 getContentResolver().openInputStream 和 android BitmapDecode example 中的死 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();
}

关于Android - 无法使用 Movie 类加载 gif 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005837/

相关文章:

android - 使用自签名证书在 android 中创建安全的客户端-服务器连接

android - 如何导入sqlite数据库android

java - 估算 Android 上从 SD 卡读取大文件的时间

javascript - 当浏览器下载所需文件时,GIF 在启动画面中缓慢动画

从 SD 卡加载 Android 文件

android - 当我使用自定义适配器时如何从 Android 中的 ListView 获取数据

java - 在Android推送通知中,当应用程序关闭时,我们如何获取点击托盘时的有效负载数据?

java - 如何提高数组列表的获取速度?

ios - iMessage 应用程序 - 将 GIF 显示为 UICollectionViewCell 时内存泄漏?

javascript - 如何制作在html中完成后消失的gif?