从Android上的Parse读取位图

时间:2014-04-12 07:53:46

标签: android bitmap sampling

ALL,

我有以下问题。这是代码:

 class ParseCommunicator
 {
    private static int width = -1;
    private static int height = -1;

@SuppressWarnings("deprecation")
public void getPhoto(Device dev) throws ParseException, IOException
{
    InputStream stream = null;
    Bitmap bmp = null;
    BitmapFactory.Options opts = new BitmapFactory.Options();
    Rect rect = new Rect();
    WindowManager wm = (WindowManager) context.getSystemService( Context.WINDOW_SERVICE );
    Display display = wm.getDefaultDisplay();
    width = display.getWidth();
    height = display.getHeight();
    try
    {
        stream = new URL( dev.getBitmapURL() ).openStream();
        opts.inJustDecodeBounds = true;
        bmp = BitmapFactory.decodeStream( stream, rect, opts );
        int bmpHeight = opts.outHeight;
        int bmpWidth = opts.outWidth;
        int inSampleSize = 1;
        int reqHeight = height / 3 ;
        int reqWidth = width / 2;
        if( bmpHeight > reqHeight || bmpWidth > reqWidth )
        {
            int halfHeight = bmpHeight / 2;
            int halfWidth = bmpWidth / 2;
            while( ( halfHeight / inSampleSize ) > reqHeight && ( halfWidth / inSampleSize ) > reqWidth )
                inSampleSize *= 2;
        }
        opts.inSampleSize = inSampleSize;
        opts.inJustDecodeBounds = false;
        bmp = BitmapFactory.decodeStream( stream, rect, opts );
    }
    catch( MalformedURLException e )
    {
        e.printStackTrace();
    }
    finally
    {
        if( stream != null )
            stream.close();
    }
    if( bmp != null )
        dev.setPhoto( bmp );
}

此代码应从Parse接口获取位图(存储为png)。运行代码时它没有给我一个位图,它在该对象中有NULL。没有例外。

尝试调试我发现了以下内容:

如果我取出采样,则会毫无问题地读取位图,即注释行:

opts.inJustDecodeBounds = true;
...............
opts.inJustDecodeBounds = false;

将生成我正在寻找的位图。

稍后将在网格视图中使用这些位图。

它正在读取的URL是正确的,因为我可以在没有采样的情况下获得没有任何问题的位图。

当我尝试对从Android Gallery中拍摄的照片进行采样并将其放在ImageView上时,相同的采样代码正常工作。

有人可以发现发生了什么吗?

我正在使用Android 2.2在LG Android手机上进行测试。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

问题是您在BitmapFactory.decodeStream()中使用了两次相同的输入流。

在您想要加载位图“for real”

之前,请尝试调用reset()
// First make sure you are using a BufferedInputStream
InputStream bis = new BufferedInputStream(stream)

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
bis.reset();

以下是其他用户的一个很好的解释:https://stackoverflow.com/a/11214451/833647