android - Android 中的 CreateFromStream 为某些 url 返回 null

标签 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 的代码 fragment 。大多数图像都会显示,但某些 url,如上面的 url1,Drawable.createFromStream 返回 null!是什么原因以及如何避免或克服这个问题?

最佳答案

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

关于android - Android 中的 CreateFromStream 为某些 url 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4601352/

相关文章:

Android Eclipse 插件 : Instrumentation Test Runner not specified

java - 关于单选按钮的选中状态

android - android 测试项目构建工具 v17 中的 VerifyError

android - 为什么 "Activity Screen"在 Redmi 设备中从后台服务启动 Activity 时不显示最近的应用程序

java - DocumentBuilder.parse() -- 权限被拒绝

android - 我们如何在流式传输后缓存 HLS 视频 url

android - Oreo 不支持的字体

java - getChildDrawingOrder 调用/使用不正常?

android - android 中的 TileMap

PHP GCM 错误信息 MismatchSenderId