Android中的CreateFromStream为某些url返回null

Posted

技术标签:

【中文标题】Android中的CreateFromStream为某些url返回null【英文标题】:CreateFromStream in Android returning null for certain url 【发布时间】:2011-06-03 20:01:43 【问题描述】: 公共类 TestButton 扩展 Activity /** 在第一次创建活动时调用。 */ 图像按钮 imgBtn; @覆盖 公共无效 onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); 设置内容视图(R.layout.main); imgBtn = (ImageButton) findViewById(R.id.image); //字符串 url = "http://thenextweb.com/apps/files/2010/03/google_logo.jpg"; 字符串 url1 = "http://trueslant.com/michaelshermer/files/2010/03/evil-google.jpg"; Drawable drawable = LoadImage(url1); imgBtn.setImageDrawable(drawable); 私人可绘制加载图像(字符串网址) 尝试 InputStream = (InputStream) new URL(url).getContent(); Drawable d = Drawable.createFromStream(is, "src"); 返回 d; 捕捉(异常 e) 返回空值;

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

【问题讨论】:

【参考方案1】:

我今天偶然发现了同样的问题。并找到了答案,幸运的是:)有一个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 1.0 版本中存在该错误,2.x 版本中是否仍然存在?在我的测试中似乎是这样,但我正在寻找谷歌的官方确认。另外,在您的代码中,您将 BUFFER_IO_SIZE 设置为什么? @ThomasW 无法确定。我可以确定的两件事是它具有相同的行为,并且在 2.1 和 2.2 中,它在模拟器和设备上都对我有用。我将更新我的答案以包含 BUFFER_IO_SIZE 值。 你,我的男人,是个天才。节省了我大量的时间来寻找这个!我很惊讶这个错误仍然存​​在。无论如何,谢谢你!使用位图比使用可绘制更有效吗? 如果在复制方法中将缓冲区大小设置为BUFFER_IO_SIZE ,则不再需要BufferedOutputStream,因为它会尝试自动填充自己的缓冲区【参考方案2】:

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

【讨论】:

以上是关于Android中的CreateFromStream为某些url返回null的主要内容,如果未能解决你的问题,请参考以下文章

Android:问题图像分辨率

是否可以从资产文件夹中加载可绘制对象?

Android中的Menu

android中的java.lang.OutOfMemoryError,同时从android中的画廊获取图像

android 6中的android webview youtube视频中的全屏模式问题

android权限--android开发中的权限及含义(上)