我们的应用程序显示相机预览,它似乎在所有手机上都能正常工作,但摩托罗拉 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() 的代码,主要取自 API演示

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 出现异常?

有帮助吗?

解决方案

我可以告诉你你的问题是以下两行之一:

parameters.setPreviewFormat(PixelFormat.YCbCr_422_SP);
parameters.setPreviewFrameRate(1);

我知道这一点,因为其余代码正是我在书中的一些相机示例中所做的,并且它们已经在 DROID 上进行了测试。

您可能希望使用 getSupportedPreviewFormats()getSupportedPreviewFrameRates() 在您的 Camera.Parameters 对象上,查看相关设备是否支持您寻求的格式和帧速率。请注意,这些方法对于 Android 2.0 来说是新的,因此它们可以在 DROID/Milestone(大概还有 Nexus One)上工作,但在撰写本文时不能用于其他方法。如果您的目标是较旧的 Android API 版本,则需要使用反射或一些类加载技巧来让这些方法在 Android 2.0 上运行,并在较旧的版本上被跳过。

其他提示

您应该检查哪些预览格式可用,以确保您可以在尽可能多的设备上运行。

看起来Droid支持PixelFormat.ycbcr_422_i pixelformat.ycbcr_420_sp

您可以使用以下方法获取可用格式的列表。getSupportedPreviewFormats()

像素格式

您可能想要调查的另一件事:

我在运行 Motoblur 并更新至 2.3 的设备(尤其是 Verizon 的 Droid2、DroidX 和 Atrix)上遇到此问题。

相机参数很好,但在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"

从取景器解决了我的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top