IOException-не удается загрузить файл
у меня есть приложение, которое показывает 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 ответов
предложение:
1.попробуйте переместить место загрузки в другую папку, например:sdcard
, или приложение другую папку, кроме cache
.
2.когда init inputstream
попробуйте использовать: init с буфером размере
int buffersize = 16*1024;
InputStream is = new BufferedInputStream(xxx,buffersize);
3.чтобы проверить файл, существующий в вашей папке
update: измените код так и не используйте 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
не null.
кроме того, хотя ваш код будет бросьте исключение,movie
также не равно null.
Я знаю, что это действительно старый пост, но у меня была та же проблема
копирование InputStream в массив байтов и вызов Movie.decodeByteArray работал на меня, даже на устройствах Samsung
мой ответ основан на ответе 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);
Android до 4.4 не удается декодировать фильм из файла и потока в случае внутреннего IOException в InputStream.метод Reset (). Но декодирование из байтов хорошо работает на всех версиях 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);