2011-01-05 8 views
9
 
public class TestButton extends Activity { 
    /** Called when the activity is first created. */ 
    ImageButton imgBtn; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     imgBtn = (ImageButton) findViewById(R.id.image); 
     //String url = "http://thenextweb.com/apps/files/2010/03/google_logo.jpg"; 
     String url1 = "http://trueslant.com/michaelshermer/files/2010/03/evil-google.jpg"; 
     Drawable drawable = LoadImage(url1); 
     imgBtn.setImageDrawable(drawable); 
    } 

    private Drawable LoadImage(String url) { 
     try { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

Powyżej znajduje się fragment kodu, którego używam do ładowania obrazu z sieci do ImageButton. Większość obrazów jest wyświetlana, ale niektóre adresy URL, takie jak powyższy, tj. Url1, Drawable.createFromStream zwróciły wartość zerową! Jaki jest powód i jak tego uniknąć lub przezwyciężyć ten problem?CreateFromStream w systemie Android zwraca wartość zerową dla określonego adresu URL

Odpowiedz

12

Dzisiaj natknąłem się na ten sam problem. I znalazłem odpowiedź, na szczęście :) Jest bug in SDK, described more or less on that google groups thread.

Obejście że pracował dla mnie jest:

 private static final int BUFFER_IO_SIZE = 8000; 

    private Bitmap loadImageFromUrl(final String url) { 
     try { 
      // Addresses bug in SDK : 
      // http://groups.google.com/group/android-developers/browse_thread/thread/4ed17d7e48899b26/ 
      BufferedInputStream bis = new BufferedInputStream(new URL(url).openStream(), BUFFER_IO_SIZE); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      BufferedOutputStream bos = new BufferedOutputStream(baos, BUFFER_IO_SIZE); 
      copy(bis, bos); 
      bos.flush(); 
      return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.size()); 
     } catch (IOException e) { 
      // handle it properly 
     } 
    } 

    private void copy(final InputStream bis, final OutputStream baos) throws IOException { 
     byte[] buf = new byte[256]; 
     int l; 
     while ((l = bis.read(buf)) >= 0) baos.write(buf, 0, l); 
    } 

I upewnij się, aby nie ustawić bufory wielkości do ponad 8k, ponieważ OS użyje domyślnego rozmiaru zamiast jednej ustawionej (zalogowaniu że oczywiście, ale zajęło mi to trochę czasu;)).

+0

To był błąd w wersji 1.0 Androida, jest to nadal występują w 2.x? W moich testach wydaje się, że tak jest, ale szukam oficjalnego potwierdzenia od Google. Ponadto, w kodzie, do czego służy ustawienie BUFFER_IO_SIZE? – ThomasW

+0

@ThomasW Nie mogę powiedzieć na pewno. Dwie rzeczy, których jestem pewien, to to, że mają to samo zachowanie i ta sama poprawka działała dla mnie w wersjach 2.1 i 2.2 zarówno na emulatorze, jak i na urządzeniu. Zaktualizuję moją odpowiedź, aby uwzględnić wartość BUFFER_IO_SIZE. – mcveat

+0

Dzięki za rozwiązanie, to działa. – sat

Powiązane problemy