我有一个显示GIF图片的应用。 如果图像保存在可绘制的中,一切正常,我可以像这样访问它
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"/>
答案 0 :(得分:14)
建议:
1.将下载位置移至另一个文件夹,例如:sdcard
,或移动应用程序除cache
以外的其他文件夹。
2.初始化inputstream
时,尝试使用:带缓冲区大小的init
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
也不为空。
答案 1 :(得分:2)
我知道这是一个非常古老的帖子,但我遇到了同样的问题
将InputStream复制到一个字节数组并调用Movie.decodeByteArray对我有用,甚至在三星设备上也是如此
答案 2 :(得分: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);
答案 3 :(得分:0)
如果在InputStream.reset()方法中出现内部IOException,则高达4.4的Android无法从文件和流中解码Movie。但是从字节解码在所有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);