Android中的CreateFromStream为某些网址返回null

时间:2011-01-05 06:20:17

标签: android

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

上面是我用来将图像从web加载到ImageButton的代码片段。大多数图像都会显示出来,但是某些网址就像上面的那个网址,即url1,Drawable.createFromStream会返回null!是什么原因以及如何避免或解决这个问题?

2 个答案:

答案 0 :(得分:14)

我今天偶然发现了同样的问题。并找到答案,幸运的是:)有一个bug in SDK, described more or less on that google groups thread

对我有用的解决方法是:

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

并确保不要将缓冲区大小设置为超过8k,因为操作系统将使用默认大小而不是您设置的大小(当然记录了,但我花了一些时间才注意到;))。

答案 1 :(得分:0)

另一个解决方案是使用FlushedInputStream http://code.google.com/p/android/issues/detail?id=6066