在 monkey test 测试中出现了一例 RuntimeException ,即 setParameters failed.
LOG显示为:
09-01 18:47:17.348 15656 15675 E AndroidRuntime: FATAL EXCEPTION: Camera Handler Thread
09-01 18:47:17.348 15656 15675 E AndroidRuntime: Process: com.android.camera, PID: 15656
09-01 18:47:17.348 15656 15675 E AndroidRuntime: java.lang.RuntimeException: setParameters failed
09-01 18:47:17.348 15656 15675 E AndroidRuntime: at android.hardware.Camera.native_setParameters(Native Method)
09-01 18:47:17.348 15656 15675 E AndroidRuntime: at android.hardware.Camera.setParameters(Camera.java:1760)
09-01 18:47:17.348 15656 15675 E AndroidRuntime: at com.android.camera.CameraManager$CameraHandler.handleMessage(CameraManager.java:260)
09-01 18:47:17.348 15656 15675 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
09-01 18:47:17.348 15656 15675 E AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
09-01 18:47:17.348 15656 15675 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)
最终查到:
09-01 18:47:17.338 235 4175 E QCameraParameters: int32_t qcamera::QCameraParameters::setZoom(const qcamera::QCameraParameters&): invalid value -1 out of (0, 60)
setZoom 的值存在异常。
解决方案就是在 setZoom 的时候,先检查 mZoomValue 是否合法,如果不合法,则 return 掉。
try {
int PreviewWidth = 0;
int PreviewHeight = 0;
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);//获取窗口的管理器
Display display = wm.getDefaultDisplay();//获得窗口里面的屏幕
Camera.Parameters parameters = mCamera.getParameters();
// 选择合适的预览尺寸
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
// 如果sizeList只有一个我们也没有必要做什么了,因为就他一个别无选择
if (sizeList.size() > 1) {
Iterator<Camera.Size> itor = sizeList.iterator();
while (itor.hasNext()) {
Camera.Size cur = itor.next();
if (cur.width >= PreviewWidth
&& cur.height >= PreviewHeight) {
PreviewWidth = cur.width;
PreviewHeight = cur.height;
break;
}
}
}
parameters.setPreviewSize(PreviewWidth, PreviewHeight); //获得摄像区域的大小
parameters.setPreviewFrameRate(3);//每秒3帧 每秒从摄像头里面获得3个画面
parameters.setPictureFormat(PixelFormat.JPEG);//设置照片输出的格式
parameters.set("jpeg-quality", 85);//设置照片质量
parameters.setPictureSize(PreviewWidth, PreviewHeight);//设置拍出来的屏幕大小
//
mCamera.setParameters(parameters);//把上面的设置 赋给摄像头
mCamera.setPreviewDisplay(mySurfaceView.getHolder());//把摄像头获得画面显示在SurfaceView控件里面
mCamera.startPreview();//开始预览
mPreviewRunning = true;
} catch (IOException e) {
Log.e(TAG, e.toString());
}
当然,这也不失为一种好的方法。我们碰到这类问题时,也可以将支持的 previewSize 或者 pictureSize 以log的形式打印出来看:
//List<Size> pictureSizes = mCameraDevice.getCamera().getParameters().getSupportedPictureSizes();
List<Size> pictureSizes = mParameters.getSupportedPictureSizes();
int length = pictureSizes.size();
for (int i = 0; i < length; i++) {
LOGD("SupportedPictureSizes : " + pictureSizes.get(i).width + "x" + pictureSizes.get(i).height);
}
//List<Size> previewSizes = mCameraDevice.getCamera().getParameters().getSupportedPreviewSizes();
List<Size> previewSizes = mParameters.getSupportedPreviewSizes();
length = previewSizes.size();
for (int i = 0; i < length; i++) {
LOGD("SupportedPreviewSizes : " + previewSizes.get(i).width + "x" + previewSizes.get(i).height);
}
总结:
http://www.eoeandroid.com/thread-28137-2-1.html
http://bbs.csdn.net/topics/370195903?page=1#post-396249333