我们的应用程序显示相机预览,除了Motorola Droid之外,它似乎在所有手机上都能正常工作,我们在设置相机参数时会遇到运行时异常:
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:611)
at com.highwaynorth.andrometer.CameraPreviewSurfaceView.surfaceChanged(CameraPreviewSurfaceView.java:57)
at android.view.SurfaceView.updateWindow(SurfaceView.java:460)
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:287)
at android.view.ViewGroup.drawChild(ViewGroup.java:1525)
这是surfaceChanged()的代码,主要取自APIDemos
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewFormat(PixelFormat.YCbCr_422_SP);
parameters.setPreviewFrameRate(1);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
有谁知道我们如何设置会导致摩托罗拉Droid上的异常的参数有什么问题?
答案 0 :(得分:2)
我可以告诉你,你的问题是以下两行之一:
parameters.setPreviewFormat(PixelFormat.YCbCr_422_SP);
parameters.setPreviewFrameRate(1);
我知道这一点,因为剩下的代码就是我在书中的一些相机样本中所做的,并且它们已经在DROID上进行了测试。
您可能希望在Camera.Parameters对象上使用getSupportedPreviewFormats()
和getSupportedPreviewFrameRates()
,以查看相关设备是否支持您寻找的格式和帧速率。请注意,这些方法对于Android 2.0来说是新手,因此它们可以在DROID /里程碑(以及可能是Nexus One)上工作,但在撰写本文时没有别的。如果您要定位较旧的Android API版本,则需要使用反射或一些类加载技巧来使这些方法在Android 2.0上运行,并在旧版本上跳过。
答案 1 :(得分:0)
您应该检查可用的预览格式,以确保您可以在尽可能多的设备上运行。
看起来像DROID支持 PixelFormat.YCbCr_422_I PixelFormat.YCbCr_420_SP
您可以使用以下方法获取可用格式列表。 getSupportedPreviewFormats()
答案 2 :(得分:0)
您可能想要调查的另一件事:
我遇到运行Motoblur并更新到2.3的设备的问题(特别是Droid2,DroidX和Atrix与Verizon)。
Camera参数很好,但在layout / capture.xml中,ViewfinderView的背景设置为透明:
<com.google.zxing.client.android.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent"
/>
嗯,看起来Android 2.3上的Motoblur透明并不透明......
去除
android:background="@color/transparent"
来自ViewFinder的解决了我的问题。