android camera setParameters failed 类问题分析总结

本文详细解析了Android Camera出现setParameters失败的问题,并提供了一种有效的解决方案。通过检查zoom值的有效性及选择合适的预览尺寸来避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 掉。

后面在网上查了一下 camera setParameters failed 同类的错误,大部分都是因为 previewSize 或者 pictureSize 设置不合理(即底层不支持)造成的。

最终有网友给出的方法就是找到一个支持的尺寸再设下去。例如:

[java] view plain copy

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的形式打印出来看:
[java] view plain copy

//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);  
}  

总结:
setParameters failed 错误肯定是某一个参数设置错了导致的。仔细查看该错误附近的log,总能找到导致问题发生的原凶!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值