2012-04-20 2 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) 

Я думаю, что это очень простая ошибка, но я не могу Не переживай. Manifest имеет:

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

Вы должны проверить, не повреждает ли файл для загрузки и сохранения. После того, как приложение загрузит файл, вы можете вытащить его из эмулятора или устройства, используя 'adb pull '. Затем вы можете проверить, точно ли это на сервере. –

+0

Я вытащил его из эмулятора, и все в порядке. Изображение 13kB, если это так важно –

+0

Вы пробовали 'Movie.decodeFile (новый файл (context.getCacheDir()," mygif.gif "). GetAbsolutePath())'? –

ответ

13

предложение:

1.try переместить место загрузки в другую папку как: sdcard или приложение другую папку, кроме cache.

2.when INIT в inputstream, попробуйте использовать: INIT с размером буфера

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. Никакой разницы; 2. Никакой разницы; 3. Он существует и не поврежден –

+0

обновите ответ, пожалуйста, проверьте. – idiottiger

+0

Спасибо, код ниже выполняет эту работу! Значок() отсутствует. Большое спасибо –

2

Я знаю, что это на самом деле старый пост, но у меня был тот же вопрос

Копирование InputStream в массив байтов и вызов Movie.decodeByteArray работал для меня, даже на Samsung Devices

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 не может декодировать фильм из файла и потока в случае внутреннего 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); 
Смежные вопросы