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.

  • Webview zeigt keine Gujarati Schriftart an
  • Mehrere Wurzel-Tags in Android Studio
  • Verwenden von benutzerdefinierten Debug Keys in Intellij IDEA 10 Community Ed
  • Android Facebook 4.0 SDK Wie bekomme ich E-Mail, Geburtsdatum und Geschlecht des Nutzers
  • Melden Sie sich mit Facebook an, wenn das Konto bereits bei der Erstanmeldung bei der Installation von Firebase mit Google verknüpft ist
  • CardView hat beim Aufblasen die Marge verloren
  •   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 ViewPager findViewById funktioniert nicht - immer wieder null
  • Android BLE, lesen und schreiben Eigenschaften
  • Android 6.0 behandelt die drawCircle-Methode falsch
  • Warum MarginBottom nicht funktioniert?
  • Bindung in ViewHolder
  • Pop das Fragment-Backstack, ohne die Pop-Animation zu spielen
  • 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.