2012-04-20 101 views
6

我有一个显示GIF图像的应用程序。 这一切工作正常,如果图像保存在绘制,我访问它像这样IOException - 无法加载文件

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

你应该测试下载和保存部分是否正在破坏文件。在应用程序下载文件后,您可以使用'adb pull '将其从仿真器或设备中拉出。然后你可以检查它是否在服务器上。 – 2012-04-20 04:03:33

+0

我把它从仿真器中拉出来,并没有问题。图像是13kB,如果不知何故很重要 – 2012-04-20 04:14:45

+0

你试过吗?Movie.decodeFile(new File(context.getCacheDir(),“mygif.gif”)。getAbsolutePath())'? – 2012-04-20 04:19:54

回答

13

建议:

1.try移动下载位置到另一个文件夹,如:sdcard,或应用程序的另一个文件夹,除了cache

2.当初始化的inputstream,尝试使用:初始化一个缓冲区大小

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

3.to检查文件的文件夹

更新的存在:改变这样的代码和不使用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也不为空。

+0

1.没有区别;没有区别; 3.它存在且没有损坏 – 2012-04-20 06:30:06

+0

更新答案,请检查。 – idiottiger 2012-04-20 06:53:36

+0

谢谢,下面的代码完成这项工作! mark()丢失。非常感谢 – 2012-04-20 07:07:38

2

我知道是真的老了后,但我有同样的问题

复制的InputStream字节数组,并呼吁Movie.decodeByteArray工作对我来说,即使是在三星设备

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); 
0

的Android高达4.4未能电影解码如果InputStream.reset()方法中存在内部IOException,则从File和Stream处理。但是从字节解码适用于所有版本的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);