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手机上进行测试。
提前谢谢。
答案 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