Android:bitmapfactory.decodestream 返回 null

Posted

技术标签:

【中文标题】Android:bitmapfactory.decodestream 返回 null【英文标题】:Android: bitmapfactory.decodestream returns null 【发布时间】:2012-05-18 10:09:11 【问题描述】:

我试图从图像的路径中获取位图图像。但BitmapFactory.decodeStream 返回null 值。

代码:

URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
connection.disconnect();
input.close();

我搜索了更多的网站,仍然没有得到解决方案。

【问题讨论】:

你确定 url 指向 BitmapFacotry 可以解码的东西吗? 是的,网址:static.adzerk.net/Advertisers/… BitmapFactory.decodeStream() 存在错误。例如,尝试将图像保存在 sd 上,而不是 decodeStream,然后通过 BitmpaFoctory 加载它或阅读以下内容:android-developers.blogspot.it/2010/07/… 【参考方案1】:

找到解决方案:

HttpGet httpRequest = new HttpGet(URI.create(path) );
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
bmp = BitmapFactory.decodeStream(bufHttpEntity.getContent());
httpRequest.abort();

问题在于,一旦您使用了来自HttpUrlConnectionInputStream,您就无法倒带并再次使用相同的InputStream。因此,您必须为图像的实际采样创建一个新的InputStream。否则我们必须中止HTTP 请求。

【讨论】:

这个解决方案对所描述的问题有什么不同?在这两个中,我看到你只使用一次流 @Guy:只有在我们可以使用 inputstream 进行 httprequest 时,如果您尝试下载另一个图像,则会像这样抛出“InputStream 已创建”错误。所以我们需要在使用 httpRequest.abort(); 下载后中止 httprequest; 谢谢。感谢您的回答。 此解决方案今天已弃用:2016 年 2 月 22 日【参考方案2】:
public Bitmap getBitmapFromUrl(String url)

Bitmap bm = null;
InputStream is = null;
BufferedInputStream bis = null;
try 

    URLConnection conn = new URL(url).openConnection();
    conn.connect();
    is = conn.getInputStream();
    bis = new BufferedInputStream(is, 8192);
    bm = BitmapFactory.decodeStream(bis);

catch (Exception e) 

    e.printStackTrace();

finally 
    if (bis != null) 
    
        try 
        
            bis.close();
        
        catch (IOException e) 
        
            e.printStackTrace();
        
    
    if (is != null) 
    
        try 
        
            is.close();
        
        catch (IOException e) 
        
            e.printStackTrace();
        
    

return bm;

不要忘记在线程(不是主线程)中调用它

【讨论】:

【参考方案3】:

我有同样的问题,但在我的情况下,问题是资源(图像)。确保图像不是 CMYK 颜色模式,因为 Android 不支持 CMYK 图像。详情请见this question

祝你好运;)

【讨论】:

【参考方案4】:

使用以下代码可以从 url 下载图像

String IMAGE_URL = "http://www.kolkatabirds.com/rainquail8vt.jpg";
            //where we want to download it from
            URL url;
            try 
                url = new URL(IMAGE_URL);

                //open the connection
                URLConnection ucon = url.openConnection();

                //buffer the download
                InputStream is = ucon.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is,1024);

                //get the bytes one by one
                int current = 0;

                while ((current = bis.read()) != -1) 
                    baf.append((byte) current);
                
                //convert it back to an image
                ByteArrayInputStream imageStream = new ByteArrayInputStream(baf.toByteArray());
                Bitmap theImage = BitmapFactory.decodeStream(imageStream);
                img.setImageBitmap(theImage);

【讨论】:

ByteArrayBuffer baf = new ByteArrayBuffer(1024); ByteArrayBuffer 类是什么?【参考方案5】:

在解码流之前需要BufferedInputStream....

试试这个,它非常适合我使用;

BufferedInputStream buf = new BufferedInputStream(inputsteam, 1024);

将 buf 传递给解码流,它将完美地工作。

Bitmap theImage = BitmapFactory.decodeStream(buf);

最后设置你的位图。

【讨论】:

以上是关于Android:bitmapfactory.decodestream 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制