android camera setParameters failed 类问题分析总结

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

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

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

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

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

参考:
http://stackoverflow.com/questions/3890381/camera-setparameters-failed-in-android
http://www.eoeandroid.com/thread-28137-2-1.html
http://bbs.youkuaiyun.com/topics/370195903?page=1#post-396249333



### Android 设备相机拍照时闪屏问题的解决方案 在 Android 开发中,当使用相机功能拍摄照片时遇到屏幕闪烁的问题,通常是由以下几个原因引起的: #### 1. **预览表面配置错误** 如果 `SurfaceView` 或 `TextureView` 的尺寸未正确设置或者与相机传感器的比例不匹配,则可能导致显示异常。确保在初始化相机之前调整好视图大小。 ```java // 设置 SurfaceView 尺寸以适应相机比例 Camera.Parameters parameters = camera.getParameters(); List<Size> sizes = parameters.getSupportedPreviewSizes(); // 选择合适的分辨率 parameters.setPreviewSize(width, height); camera.setParameters(parameters); ``` 此部分涉及如何适配相机参数到实际使用的界面组件[^1]。 --- #### 2. **闪光灯模式冲突** 某些设备可能由于闪光灯模式切换不当而导致短暂的白屏现象。可以通过显式禁用自动闪光或将闪光灯设为关闭状态来避免这一问题。 ```java // 配置闪光灯行为 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); String[] cameraIds = manager.getCameraIdList(); try { manager.setTorchMode(cameraIds[0], false); // 关闭手电筒模式 } catch (Exception e) { Log.e("CAMERA", "Failed to disable torch mode"); } } else { Camera.Parameters params = camera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); camera.setParameters(params); } ``` 上述代码片段展示了通过管理不同版本 SDK 下的闪光灯逻辑减少干扰的方法[^2]。 --- #### 3. **异步处理延迟** 如果捕获图像的操作被放置在一个耗时较长的任务队列中执行(例如主线程),则可能会引起 UI 卡顿甚至视觉上的“闪屏”。建议采用独立线程完成图片保存工作,并利用回调机制通知主程序更新界面上的状态变化。 ```java new Thread(() -> { PictureCallback callback = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); if (pictureFile == null){ return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) {} catch (IOException e){} } }; camera.takePicture(null,null,callback); }).start(); ``` 这里强调了多线程技术的重要性以及其对于用户体验流畅性的贡献[^3]。 --- #### 4. **硬件加速选项** 最后,在应用清单文件 (`AndroidManifest.xml`) 中确认启用了硬件加速支持;否则图形渲染过程中的任何缺陷都可能表现为不可预测的行为比如突然变黑或亮起整个屏幕区域。 ```xml <!-- 启用全局级别的硬件加速 --> <application android:hardwareAccelerated="true"> </application> ``` 启用硬件加速能够显著改善复杂动画效果的表现同时也减少了潜在兼容性风险[^4]。 --- ### 总结 综上所述,解决 Android 上相机拍照行动伴随而来的闪屏状况需综合考虑多个方面因素包括但不限于:合理设定预览窗口规格、妥善控制灯光装置运作方式、优化后台计算流程结构还有适当调节系统级绘图性能偏好等等措施共同作用才能达到最佳成效[^5]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值