2011-01-05 14 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; 
     } 
    } 
} 

Sopra è il frammento di codice che utilizzo per caricare l'immagine dal web in ImageButton. La maggior parte delle immagini viene visualizzata, ma alcuni URL come quello sopra, cioè url1, Drawable.createFromStream restituisce null !! Qual è la ragione e come evitarlo o superare questo problema?CreateFromStream in Android restituendo null per un certo URL

risposta

12

Oggi mi sono imbattuto nello stesso problema. E ho trovato una risposta, per fortuna :) C'è un bug in SDK, described more or less on that google groups thread.

Soluzione che ha funzionato per me è:

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

E assicurarsi di non impostare i buffer dimensioni a più di 8k, perché OS utilizzerà dimensione predefinita al posto di quello impostato (registrazione che, naturalmente, ma mi ci è voluto un po 'per notare che;)).

+0

Questo bug è stato nella versione 1.0 di Android, è ancora in giro in 2.x? Nei miei test sembra essere il caso, ma sto cercando la conferma ufficiale da parte di Google. Inoltre, nel tuo codice, cosa hai impostato su BUFFER_IO_SIZE? – ThomasW

+0

@ThomasW Non posso dirlo con certezza. Due cose di cui sono certo sono che ha lo stesso comportamento e la stessa correzione ha funzionato per me in 2.1 e 2.2 sia su emulatore che su dispositivo. Aggiornerò la mia risposta per includere il valore BUFFER_IO_SIZE. – mcveat

+0

Grazie per la soluzione, funziona. – sat

Problemi correlati