【问题标题】:Android - Failing to load gif file using Movie classAndroid - 无法使用电影类加载 gif 文件
【发布时间】:2011-08-25 17:42:57
【问题描述】:

我正在尝试使用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);

它似乎加载了 something,因为 movie 不为空。但问题是movie.duration() 返回0

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

【问题讨论】:

    标签: android gif android-sdcard


    【解决方案1】:

    我也遇到过这个。经过多次试验和错误,我使用 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();
    }
    

    【讨论】:

      【解决方案2】:

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

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

      而不是

      Movie.decodeFile(path);
      

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

      【讨论】:

        【解决方案3】:
         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();
                    }
        

        【讨论】:

          猜你喜欢
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 2014-03-25
          • 2011-12-31
          相关资源
          最近更新 更多