我正在开发一个适用于所有预冰淇淋三明治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中的一些错误引起的,但我找不到任何与此相关的错误或问题。如果有人能指出我正确的方向,那就太棒了。在此先感谢!!
答案 0 :(得分:2)
是的,欢迎来到Android的碎片化。处理摄像机是碎片处于丑陋状态的地方。每个设备都会响应不同的参数,并且无法保证这些参数是什么。你只需要测试。一旦确定哪个设备响应了什么,就会对特定设备或API版本进行运行时检查以设置适当的参数。
答案 1 :(得分:1)
在http://developer.android.com/reference/android/hardware/Camera.html中,您会看到
&#34;此[Camera]类不是线程安全的,可用于一个事件线程。 ......绝不能一次从多个线程调用此类的方法。&#34;
您是否尝试在setPreviewCallbackWithBuffer()或setPreviewCallback()中调用所有这些方法?它们都会创建新的线程。
另一个注意事项:您应该只在停止预览时更改参数。
我现在也有同样的问题;确切的代码适用于2.2,但不适用于4.0 +。