2012-08-17 15 views
27

Ich verwende meine Localhost, um Bilder abzurufen und in einem ImageView anzuzeigen. Aus irgendeinem Grund bekomme ich den Fehler "Factory" zurück. Ich habe den Code viele Male durchgesehen und ich sehe nicht, was falsch ist. Jede Hilfe wäre willkommen!Android: SkImageDecoder :: Factory zurückgegeben Null

GalleryZoom.java

public class Zoom extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.gallery_zoom); 

     String selection = getIntent().getExtras().getString("image"); 
     Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 

     new backgroundLoader().execute();  
    } 


    private class backgroundLoader extends AsyncTask<Void, Void, Void> { 
     Bitmap bmp; 

     @Override 
     protected Void doInBackground(Void... params) { 

      bmp = DecodeBitmapSampleSize(getIntent().getExtras().getString("image"), 48, 64); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 

      ImageView image = (ImageView) findViewById(R.id.imageZoom); 
      image.setImageBitmap(bmp); 
     } 

    } 

    public Bitmap DecodeBitmapSampleSize (String strURL, int reqWidth, int reqHeight) { 
     InputStream in = null; 
     Bitmap bmp = null; 

     in = OpenHttpConnection(strURL); 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(in, null, options); 

     options.inSampleSize = calculateSampleSize(options, reqWidth, reqHeight); 

     options.inJustDecodeBounds = false; 
     bmp = BitmapFactory.decodeStream(in, null, options); 
       return bmp; 
    } 

    private InputStream OpenHttpConnection(String strURL) { 

     try { 
      URL url = new URL(strURL); 

      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      InputStream in = new BufferedInputStream(connection.getInputStream()); 
      return in; 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
      return null; 
     } 
    } 

    public static int calculateSampleSize(BitmapFactory.Options options, 
      int reqWidth, int reqHeight) { 

     final int width = options.outWidth; 
     final int height = options.outHeight; 
     int inSampleSize = 1; 

     if (width > reqWidth || height > reqHeight) { 
      if (width > height) { 
       inSampleSize = Math.round((float) height/(float) reqHeight); 
      } else { 
       inSampleSize = Math.round((float) width/(float) reqWidth); 
      } 
     } 
     return inSampleSize; 
    } 

} 

LogCat Log

08-13 21:55:19.578: I/MemoryCache(3197): MemoryCache maximum limit is 6MB 
08-13 21:55:19.658: I/MemoryCache(3197): cache size = 24600, length = 1 
08-13 21:55:19.688: I/MemoryCache(3197): cache size = 24600, length = 1 
08-13 21:55:19.708: I/MemoryCache(3197): cache size = 24600, length = 1 
08-13 21:55:19.708: I/MemoryCache(3197): cache size = 24600, length = 1 
08-13 21:55:20.628: I/MemoryCache(3197): cache size = 71600, length = 2 
08-13 21:55:20.678: I/MemoryCache(3197): cache size = 101408, length = 3 
08-13 21:55:26.228: I/MemoryCache(3197): MemoryCache maximum limit is 6MB 
08-13 21:55:26.228: I/MemoryCache(3197): MemoryCache maximum limit is 6MB 
08-13 21:55:26.998: D/skia(3197): --- SkImageDecoder::Factory returned null 
+0

siehe diesen Beitrag es für mich gearbeitet: [http://stackoverflow.com/questions/23559736/android-skimagedecoderfactory-returned-null-error][1] [1]: http://stackoverflow.com/questions/23559736/android-skimagedecoderfactory-returned-null-error – mithil1501

Antwort

59

ich das gleiche Problem gestoßen sind. Und ich stelle auch sicher, dass die URL korrekt ist, um das Bild herunterzuladen. Durch das Debuggen des Codes fand ich, dass die Variable der Position im Eingangsstrom nach der ersten Decodierung auf 1024 gesetzt wurde. Also füge ich inputstream.reset() vor der zweiten Dekodierung hinzu. Das funktioniert. Hoffnung kann anderen helfen.

+6

Das ist für mich gearbeitet, aber stellen Sie sicher, dass Sie '' 'boolean unterstützt = inputStream.markSupported() aufrufen,' "Zuerst. Markierung muss unterstützt werden oder Reset() wird eine '' IOException''' auslösen. Wenn es nicht unterstützt wird, öffnen Sie möglicherweise einen zweiten Eingabestream. – Shellum

+0

Wie hast du das gelöst? Ich habe das gleiche Problem und ich habe es hier gepostet: http://StackOverflow.com/Questions/17774442/How-to-Get-Bitmap-Information-and-then-decode-bitmap-from-Internet-inputstream. Aus irgendeinem Grund funktioniert es nicht auf einigen sehr spezifischen Websites und Dateien. –

1

Ich hatte ein ähnliches Problem beim Lesen eines Streams von einem Intent aus der Galerie App zurückgegeben. inputstream.reset() löst eine IOException aus, wie Shellum oben erwähnt, also habe ich es gelöst, indem ich den Stream einfach geschlossen und wieder geöffnet habe. Einfach und machte den Trick.

+0

Ich folgte diesem Rat, indem ich die Stream-Position auf 0 (in C#) setzte – Gandalf458

11

Hallo Leute, nachdem ich mich umgesehen habe, habe ich die beste Lösung. als #jia George darauf hinweisen, dass Sie den Eingabestream nach der ersten Dekodierung zurückgesetzt werden, das Problem ist, dass einige Zeit zurückgesetzt wird nicht unterstützt, aber Sie können Eingangsstrom in einem BufferedInputStream umbrechen und dieser ist in Ordnung.

final BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BufferedInputStream buffer=new BufferedInputStream(is); 
BitmapFactory.decodeStream(buffer,null,options); 
buffer.reset(); 

    // Calculate inSampleSize 
options.inSampleSize = calculateInSampleSize(options, reqWidth,reqHeight); 

    // Decode bitmap with inSampleSize set 
options.inJustDecodeBounds = false; 
BitmapFactory.decodeStream(buffer,null,options); 
+0

das einzige, was für mich funktioniert! – Ricardo

11

Dies könnte ein seltener Fall sein, aber für die von Ihnen Picasso verwenden werden Sie diesen Fehler sehen, wenn Sie versuchen, ein Bild von URL zu laden, aber die URL verweist nicht auf ein Bild.

Zum Beispiel:
http://www.google.ca
statt:
https://www.google.ca/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

+0

Auch einige URLs können mit '.jpg',' .png', '.tif' usw. enden, beziehen sich aber nicht auf ein Bild. Zum Beispiel: http://www.guoguiyan.com/data/out/96/69698096-high-resolution-wallpapers.jpg. – shoe

Verwandte Themen