首页 文章

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

提问于
浏览
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;
        }
    }
}

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

2 回答

  • 12

    我今天偶然发现了同样的问题 . 并找到了答案,幸运的是:)有一个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,因为操作系统将使用默认大小而不是您设置的大小(当然记录,但我需要一段时间才注意到;)) .

  • 0

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

相关问题