camera setParameters在android 4.0.1和4.0.2中不起作用

时间:2012-01-20 02:57:44

标签: android android-camera android-4.0-ice-cream-sandwich

我正在开发一个适用于所有预冰淇淋三明治Android版本以及ICS 4.0.3的应用程序。但是对于版本4.0.1和4.0.2的Galaxy Nexus,当我调用Camera.setParameters()

时强制关闭

我的代码段在下面给出

// mCamera is my camera object.
// mFrameWidth and mFrameHeight are my desired preview size
Camera.Parameters params = mCamera.getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
width = mFrameWidth;
height = mFrameHeight;

// selecting optimal camera preview size closest to desired size
double minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
     if (Math.abs(size.width - width) < minDiff) {
         mFrameWidth = size.width;
         mFrameHeight = size.height;
         minDiff = Math.abs(size.width - width);
     }
 }
 params.setPreviewSize(mFrameWidth, mFrameHeight);

 // Crashes here
 mCamera.setParameters(params);

这是崩溃报告

java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1295)
at com.example.MySurfaceView.surfaceChanged(MySurfaceView.java:182)
at android.view.SurfaceView.updateWindow(SurfaceView.java:544)
at android.view.SurfaceView.access$000(SurfaceView.java:81)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

似乎这个问题是由ICS版本4.0.1和4.0.2中的一些错误引起的,但我找不到任何与此相关的错误或问题。如果有人能指出我正确的方向,那就太棒了。在此先感谢!!

2 个答案:

答案 0 :(得分:2)

是的,欢迎来到Android的碎片化。处理摄像机是碎片处于丑陋状态的地方。每个设备都会响应不同的参数,并且无法保证这些参数是什么。你只需要测试。一旦确定哪个设备响应了什么,就会对特定设备或API版本进行运行时检查以设置适当的参数。

答案 1 :(得分:1)

http://developer.android.com/reference/android/hardware/Camera.html中,您会看到

  

&#34;此[Camera]类不是线程安全的,可用于一个事件线程。 ......绝不能一次从多个线程调用此类的方法。&#34;

您是否尝试在setPreviewCallbackWithBuffer()或setPreviewCallback()中调用所有这些方法?它们都会创建新的线程。

另一个注意事项:您应该只在停止预览时更改参数。

我现在也有同样的问题;确切的代码适用于2.2,但不适用于4.0 +。