我正在尝试构建一个简单的摄影应用程序。启动时,会向用户显示一个基本的mainActivity,其中包含工具栏和imageView。用户按下操作栏中的操作按钮,该操作按钮创建使用startActivityForResult()
启动相机应用程序的意图。然后,用户使用相机应用程序拍摄的照片将返回到mainActivity。我得到图像和imageView的大小,并使用它们来计算缩放因子,我用它来解码较小版本的位图,如下所示:
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mImageFileLocation, bitmapFactoryOptions);
int actualCameraImageWidth = bitmapFactoryOptions.outWidth;
int actualCameraImageHeight = bitmapFactoryOptions.outHeight;
int heightScale = actualCameraImageHeight / imageViewHeight;
int widthScale = actualCameraImageWidth / imageViewWidth;
Integer factorToUse;
if (heightScale == widthScale) {
Toast.makeText(this, "scales are the same: " + heightScale, Toast.LENGTH_SHORT).show();
factorToUse = heightScale;
} else {
factorToUse = Math.min(heightScale, widthScale);
Toast.makeText(this, "scales are DIFFERENT: " + factorToUse, Toast.LENGTH_SHORT).show();
}
bitmapFactoryOptions.inSampleSize = factorToUse;
bitmapFactoryOptions.inJustDecodeBounds = false;
Bitmap reducedSizePhoto = BitmapFactory.decodeFile(mImageFileLocation, bitmapFactoryOptions); //decode the image with that scale option set
imageView.setImageBitmap(reducedSizePhoto);
然后我在mainActivity的imageView中显示解码的位图。
如果用户在拍照时将设备保持在相同的方向,该应用效果很好。但是,如果他们按下操作按钮然后在相机应用程序中更改其设备的方向,则会抛出RunTimeException,并显示以下消息java.lang.RuntimeException: Unable to resume activity {com.wescj.cameraapplication/com.wescj.cameraapplication.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { }} to activity {com.wescj.cameraapplication/com.wescj.cameraapplication.MainActivity}: java.lang.ArithmeticException: divide by zero
,然后是大量堆栈跟踪。
使用调试器,我想我已经追溯到这个错误的根源,因为出于某种原因,当用户在相机应用程序中更改设备方向时,imageView的高度和宽度变为0,导致'除以0'错误。
如果在使用相机时改变方向,我已经尝试了一切我能想到的停止应用程序崩溃的方法。我搜索了android文档并查看了stackOverflow上的这么多线程。我尝试将不同的xml属性添加到imageView,例如adjustViewBounds
和setScaleType
。我甚至尝试在onResultActivity()
上使用intent来启动mainActivity并显示图像。但它们都没有奏效。任何人都可以了解为什么imageView尺寸变为0?
完整代码可在以下位置查看:https://github.com/Wes1324/CameraApplication/tree/action_bar_button
感谢任何提前帮助我的人。
答案 0 :(得分:0)
尝试将 screenSize 添加到您的活动中
<Activity android:configChanges="orientation|keyboardHidden|screenSize" ...>
并覆盖,以便您可以自行处理配置更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
此处有更多信息:Handling Configuration Changes