IOException – Datei kann nicht geladen werden

Ich habe eine App, die GIF-Bilder zeigt. Es funktioniert alles gut, wenn das Bild in ziehbar gespeichert ist , und ich greife darauf so zu

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

Aber ich muss das Bild aus dem Internet herunterladen, also lese ich es an CacheDir, das geht gut. Ich habe versucht, es zu lesen.

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

Und das

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

Aber egal was, es endet mit

 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) 

oder

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

Ich denke, es ist ein ganz einfacher Fehler, aber ich kann nicht darüber hinwegkommen. Manifest hat:

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

  • Android-Bluetooth-Verbindung - Service Discovery fehlgeschlagen
  • Google Drive SDK für OCR
  • Xml Puller Vermögenswerte xml
  • Neues GCM API Register Unbekannter Quellfehler
  • Java.io.IOException: SERVICE_NOT_AVAILABLE im GCM-Client
  • Java.io.ioexception: open failed: einval (Ungültiges Argument) beim Speichern eines Bildes auf externen Speicher
  • Gibt es eine Grenze für die Anzahl der Dateien in einem Verzeichnis auf einer SD-Karte?
  • MediaPlayer.setDataSource verursacht IOException für gültige Datei
  • 4 Solutions collect form web for “IOException – Datei kann nicht geladen werden”

    Vorschlag:

    1.try verschieben Sie den Download-Speicherort in einen anderen Ordner wie: sdcard oder die App einen anderen Ordner außer dem cache .

    2.wenn init die inputstream , Versuch verwenden: init mit einer Puffergröße

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

    3. um die in Ihrem Ordner vorhandene Datei zu überprüfen

    Update: Ändern Sie den Code so und verwenden Sie nicht 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); 

    Keine Ausnahme zu werfen, und der movie ist nicht null.

    Auch wenn dein Code die Ausnahme auslöst, ist der movie auch nicht null.

    Ich weiß, ist ein wirklich alter Posten, aber ich hatte das gleiche Problem

    Das Kopieren des InputStreams in ein Byte-Array und das Aufrufen von Movie.decodeByteArray hat für mich gearbeitet, auch bei Samsung Devices

    Meine Antwort basiert auf der Antwort von BeNeXuS.

    Die Dateigröße ist vielleicht nicht immer bekannt, siehe:

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

    oder

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

    Nach dem 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 bis zu 4.4 kann den Film aus Datei und Stream im Falle einer internen IOException in der InputStream.reset () – Methode nicht entschlüsseln. Aber das Decodieren von Bytes funktioniert gut auf allen Versionen von Android. Hier ist ganz minimal Version von Code, um dies zu tun:

     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); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.