关于nexus one的Camera.setParameters()的RuntimeException

时间:2010-01-12 03:28:06

标签: android camera

我从the answer here复制了代码,但我仍然遇到了一个RuntimeException:我的nexus上的setParameters失败错误。我的清单文件具有camera和wake_lock权限。这适用于模拟器,在机器人上我没有得到错误但它确实有旋转问题。

7 个答案:

答案 0 :(得分:41)

您最有可能要求无效的预览尺寸。如果您检查adb logcat的结果,您可能会看到类似这样的内容:

E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724

解决方案是请求最接近的预览尺寸到您想要的尺寸;您可以通过调用Camera.Parameters返回的Camera.getParameters对象中的getSupportedPreviewSizes来获取可用预览尺寸列表。

答案 1 :(得分:26)

我用罗马所说的代码修正了这个:

   Camera.Parameters parameters = camera.getParameters();  
   List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();  
   Camera.Size cs = sizes.get(0);  
   parameters.setPreviewSize(cs.width, cs.height);  
   camera.setParameters(parameters);

答案 2 :(得分:10)

对于它的价值,我的问题的根源是我试图通过检查parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);而没有先验证闪存模式是否支持来调用parameters.getFlashMode() != null

这个记录不当的异常导致的原因不止一个,因此请检查所有参数,而不仅仅是使用supportedPreviewSize

答案 3 :(得分:3)

以上都没有为我解决这个问题。尽管如此,在设置参数之前添加此代码。

// stop preview before making changes
    try {
        mCamera.stopPreview();
    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
    }

//now set your parameters

答案 4 :(得分:2)

对我来说,这会在拍照后发生,预览会冻结,直到我更新我的参数调用如下。确保检查相机要求设置的所有参数以确保您要求相机将自己设置为的所有参数都可用于相机,这一点非常重要。

Camera.Parameters parameters = myCamera.getParameters();

预览尺寸:

if (myCamera.getParameters().getSupportedPreviewSizes() != null){
     Camera.Size previewSize = getOptimalPreviewSize(myCamera.getParameters().getSupportedPreviewSizes(), width, height);;
     parameters.setPreviewSize(previewSize.width, previewSize.height);
}

使用闪光/对焦模式:

if(parameters.getSupportedFocusModes() != null && parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}

if (parameters.getSupportedFlashModes() != null && parameters.getSupportedFlashModes().contains(Camera.Parameters.FLASH_MODE_AUTO)){
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

}

myCamera.setParameters(parameters);

等。所有这些都包含在一个很好的try {} catch(){}中。祝你好运。

以下是来自this great tutorial的getOptimalPreview尺寸:

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int width, int height)
    {
        // Source: http://stackoverflow.com/questions/7942378/android-camera-will-not-work-startpreview-fails
        Camera.Size optimalSize = null;

        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio = (double) height / width;

        // Try to find a size match which suits the whole screen minus the menu on the left.
        for (Camera.Size size : sizes){

            if (size.height != width) continue;
            double ratio = (double) size.width / size.height;
            if (ratio <= targetRatio + ASPECT_TOLERANCE && ratio >= targetRatio - ASPECT_TOLERANCE){
                optimalSize = size;
            }
        }

        // If we cannot find the one that matches the aspect ratio, ignore the requirement.
        if (optimalSize == null) {
            // TODO : Backup in case we don't get a size.
        }

        return optimalSize;
    }

答案 5 :(得分:0)

opencamera这样的开源相机项目总是使用try-catch来调用Camera.setParameters:

private void setCameraParameters(Camera.Parameters parameters) {
    if( MyDebug.LOG )
        Log.d(TAG, "setCameraParameters");
    try {
        camera.setParameters(parameters);
        if( MyDebug.LOG )
            Log.d(TAG, "done");
    } catch (RuntimeException e) {
        // just in case something has gone wrong
        if( MyDebug.LOG )
            Log.d(TAG, "failed to set parameters");
        e.printStackTrace();
        count_camera_parameters_exception++;
    }
}

此外,在致电getParameters之前,请始终获取最新的setParameters

void setRotation(int rotation) {
    Camera.Parameters parameters = this.getParameters();
    parameters.setRotation(rotation);
    setCameraParameters(parameters);
}

答案 6 :(得分:0)

来自Sam的解决方案是正确的,但输出图像仍在几台平板设备上进行了一些缩放。我在Internet上找到的最佳实践之一,我们应该在Camera主机中设置,以便每次恢复相机时都会重复使用这些属性。这是CameraHost中实现的方法:

@Override
        public Parameters adjustPreviewParameters(Parameters parameters) {
            List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
            Camera.Size cs = sizes.get(0);
            parameters.setPreviewSize(cs.width, cs.height);
            return super.adjustPreviewParameters(parameters);
        }