2012-08-17 12 views
27

Używam mojego localhost do pobierania obrazów i przeglądania w ImageView. Z jakiegoś powodu otrzymuję Factory zwrócony błąd zerowy. Wiele razy przeglądałem kod i nie widzę, co jest nie tak. Każda pomoc będzie doceniona!Android: SkImageDecoder :: Factory zwrócił wartość zerową

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

odnoszą ten post pracował dla mnie: [http://stackoverflow.com/questions/23559736/android-skimagedecoderfactory-returned-null-error][1] [1]: http://stackoverflow.com/questions/23559736/android-skimagedecoderfactory-returned-null-error – mithil1501

Odpowiedz

59

jakie napotkał ten sam problem. A także upewniam się, że adres URL jest poprawny, aby pobrać obraz. Debugując kod, stwierdziłem, że zmienna pozycji w strumieniu wejściowym została ustawiona na 1024 po pierwszym dekodowaniu. Dodam więc inputstream.reset() przed drugim dekodowaniem. To działa. Nadzieja może pomóc innym.

+6

To działało dla mnie, ale upewnij się, że nazywasz '' 'boolean supported = inputStream.markSupported()' '' pierwszy. Oznaczenie musi być obsługiwane lub resetowane() spowoduje wyrzucenie '' 'IOException'''. Jeśli nie jest obsługiwany, może otworzyć drugi strumień wejściowy. – Shellum

+0

jak to rozwiązałeś? Mam ten sam problem i napisałem o tym tutaj: http://stackoverflow.com/questions/17774442/how-to-get-bitmap-information-and-then-decode-bitmap-from-internet-inputstream. z jakiegoś powodu nie działa na niektórych bardzo konkretnych stronach i plikach. –

1

Miałem podobny problem podczas odczytu strumienia z intencji zwróconej z aplikacji galerii. inputstream.reset() generuje wyjątek IOException, o czym wspomniał wcześniej Shellum, więc rozwiązałem go po prostu zamykając strumień i ponownie go otwierając. Proste i załatwił sprawę.

+0

Postępowałem zgodnie z tą radą, ustawiając pozycję strumienia na 0 (w języku C#) – Gandalf458

11

Witajcie, ja, po rozejrzeniu się, mam najlepsze rozwiązanie. jako #jia George zwraca uwagę, że po pierwszym dekodowaniu resetuje się sygnał wejściowy, problem polega na tym, że pewien reset czasu nie jest obsługiwany, ale można zawinąć strumień wejściowy do bufora wejściowego, a ten jest w porządku.

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

jedyną rzeczą, która działa dla mnie! – Ricardo

11

To może być rzadki przypadek, ale dla tych z was, używając Picasso zobaczysz ten błąd przy próbie załadowania obrazu z URL, ale URL nie odnosi się do obrazu.

Na przykład:
http://www.google.ca
zamiast:
https://www.google.ca/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

+0

Również niektóre adresy URL mogą kończyć się '.jpg',' .png', '.tif', itp., Ale w rzeczywistości nie odnoszą się do obrazu. Na przykład: http://www.guoguiyan.com/data/out/96/69698096-high-resolution-wallpapers.jpg. – shoe

Powiązane problemy