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

Above es el fragmento de código que utilizo para cargar imágenes de web en ImageButton. La mayoría de las imágenes se muestran, pero ciertas URL como la anterior, es decir, url1, Drawable.createFromStream devuelve null !! ¿Cuál es el motivo y cómo evitarlo o superar este problema?CreateFromStream en Android que devuelve nulo para cierta url

Respuesta

12

Hoy he tropezado con el mismo problema. Y encontré una respuesta, por suerte :) Hay un bug in SDK, described more or less on that google groups thread.

solución que funcionó para mí es:

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

Y asegúrese de no fijar amortiguadores tamaño a más de 8k, porque OS utilizará el tamaño predeterminado en lugar de al ajustado (el registro que, por supuesto, pero me llevó un tiempo darme cuenta de eso;)).

+0

Ese fallo fue en la versión 1.0 de Android, ¿sigue siendo alrededor de 2.x? En mis pruebas parece ser el caso, pero estoy buscando la confirmación oficial de Google. Además, en su código, ¿a qué le asigna BUFFER_IO_SIZE? – ThomasW

+0

@ThomasW No puedo asegurarlo. Dos cosas de las que estoy seguro es que tienen el mismo comportamiento y la misma solución me funcionó en 2.1 y 2.2 tanto en el emulador como en el dispositivo. Actualizaré mi respuesta para incluir el valor BUFFER_IO_SIZE. – mcveat

+0

Gracias por la solución, funciona. – sat

Cuestiones relacionadas