6

我有一个显示 GIF 图像的应用程序。如果图像保存在 drawable 中,一切正常,我像这样访问它

is=context.getResources().openRawResource(R.drawable.mygif);
movie = Movie.decodeStream(is);

但我需要从互联网上下载图像,所以我将它保存到 CacheDir,效果很好。我尝试了以下内容来阅读它。

    try
    {
        is = new BufferedInputStream(new FileInputStream(new File(context.getCacheDir(), "mygif.gif")));
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    movie = Movie.decodeStream(is);

和这个

movie = Movie.decodeFile(new File(context.getCacheDir(), "mygif.gif").getPath());

但无论如何,它以

java.io.IOException
at java.io.InputStream.reset(InputStream.java:218)
at android.graphics.Movie.decodeStream(Native Method)
at android.graphics.Movie.decodeTempStream(Movie.java:74)
at android.graphics.Movie.decodeFile(Movie.java:59)

或者

java.io.IOException: Mark has been invalidated.
at java.io.BufferedInputStream.reset(BufferedInputStream.java:350)
at android.graphics.Movie.decodeStream(Native Method)

我认为这是一个非常简单的错误,但我无法克服它。清单有:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4

4 回答 4

14

建议:

1.尝试将下载位置移动到另一个文件夹,例如:sdcard,或应用程序除cache.

2.当初始化时inputstream,尝试使用:带有缓冲区大小的初始化

int buffersize = 16*1024;
InputStream  is = new BufferedInputStream(xxx,buffersize);

3.检查文件夹中存在的文件

更新:像这样更改代码并且不要使用Movie.decodeFile

 InputStream is = null;
    try {
        is = new BufferedInputStream(new FileInputStream(new File(getCacheDir(), "mygif.gif")), 16 * 1024);
        is.mark(16 * 1024); 
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
movie = Movie.decodeStream(is);

没有异常抛出,并且movie不为空。

此外,虽然您的代码会抛出异常,但movie也不为空。

于 2012-04-20T05:38:22.233 回答
2

我知道这是一个非常旧的帖子,但我遇到了同样的问题

将 InputStream 复制到字节数组并调用 Movie.decodeByteArray 对我有用,即使在三星设备上也是如此

于 2014-10-06T17:40:36.870 回答
0

我的回答基于 BeNeXuS 的回答。

文件大小可能并不总是已知,请参阅:

File file = ...;
InputStream inputStream = new FileInputStream(file);

或者

InputStream inputStream = getContext().getContentResolver().openInputStream(uri);

得到 inputStream 后:

BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte buffer[] = new byte[1024];
int len;
while ((len = bis.read(buffer, 0, buffer.length)) > 0) {
    baos.write(buffer, 0, len);
}
bis.close();

byte[] imageData = baos.toByteArray();
baos.close();

Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
于 2015-08-18T16:35:11.657 回答
0

在 InputStream.reset() 方法中出现内部 IOException 的情况下,Android 最高 4.4 无法从文件和流中解码电影。但是从字节解码在所有版本的 Android 上都运行良好。这是执行此操作的代码的最小版本:

int size = (int) imageFile.length();
byte[] buffer = new byte[size];
FileInputStream inputStream = new FileInputStream(imageFile);
int readLength = inputStream.read(buffer);
inputStream.close();
Movie movie = Movie.decodeByteArray(buffer, 0, readLength);
于 2016-04-04T10:56:26.197 回答