Android 2.2 SDK - Nexus One 上的相机 API 的 setParameters 失败

Android 2.2 SDK - setParameters failed for Camera API on Nexus One(Android 2.2 SDK - Nexus One 上的相机 API 的 setParameters 失败)
本文介绍了Android 2.2 SDK - Nexus One 上的相机 API 的 setParameters 失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在使用稍微修改过的 Camera API Demo 版本,它可以在模拟器中运行.我正在使用在其中一个邮件组中找到的反射类,但在我的 Nexus One(Android 2.2.1)上测试时仍然出现此错误:

I am using a slightly modified version of the Camera API Demo and it works in the emulator. I am using a reflect class I found in one of the mailing groups, but I still get this error when testing on my Nexus One (Android 2.2.1):

12-29 13:22:04.027: ERROR/QualcommCameraHardware(2145): Invalid preview size requested: 320x402
12-29 13:22:04.037: DEBUG/AndroidRuntime(16514): Shutting down VM
12-29 13:22:04.037: WARN/dalvikvm(16514): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514): FATAL EXCEPTION: main
12-29 13:22:04.047: ERROR/AndroidRuntime(16514): java.lang.RuntimeException: setParameters failed
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.hardware.Camera.native_setParameters(Native Method)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.hardware.Camera.setParameters(Camera.java:647)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at com.android.iwasthere.Preview.surfaceChanged(Preview.java:78)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.SurfaceView.updateWindow(SurfaceView.java:538)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.View.draw(View.java:6743)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.View.draw(View.java:6743)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewRoot.draw(ViewRoot.java:1407)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.os.Looper.loop(Looper.java:123)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at java.lang.reflect.Method.invokeNative(Native Method)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at java.lang.reflect.Method.invoke(Method.java:521)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-29 13:22:04.047: ERROR/AndroidRuntime(16514):     at dalvik.system.NativeStart.main(Native Method)

CameraPreview.java

CameraPreview.java

package xxx;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class CameraPreview extends Activity {

    private Preview mPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        mPreview = new Preview(this);
        setContentView(mPreview);

    }

}

Preview.java

Preview.java

package xxx;
import java.io.IOException;
import java.util.List;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class Preview extends SurfaceView implements SurfaceHolder.Callback {

    SurfaceHolder mHolder;
    Camera mCamera;

    Preview(Context context) {
        super(context);

        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    public void surfaceCreated(SurfaceHolder holder) {

        mCamera = Camera.open();
        try {

           mCamera.setPreviewDisplay(holder);

        } catch (IOException exception) {

            mCamera.release();
            mCamera = null;

        }

    }

    public void surfaceDestroyed(SurfaceHolder holder) {

        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;

    }


    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {

        final double ASPECT_TOLERANCE = 0.05;
        double targetRatio = (double) w / h;
        if (sizes == null) return null;

        Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        int targetHeight = h;

        for (Size size : sizes) {
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }

        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }

        return optimalSize;

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

        Camera.Parameters parameters = mCamera.getParameters();

        //MODIFIED HERE
        List<Size> sizes = Reflect.getSupportedPictureSizes(parameters);
        //List<Size> sizes = parameters.getSupportedPreviewSizes();
        Size optimalSize = getOptimalPreviewSize(sizes, w, h);
        parameters.setPreviewSize(optimalSize.width, optimalSize.height);

        mCamera.setParameters(parameters);
        mCamera.startPreview();

    }

}

Reflect.java

Reflect.java

package xxx;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import android.hardware.Camera;
import android.hardware.Camera.Size;

public class Reflect {

    private static Method Parameters_getSupportedPictureSizes;
    private static Method Parameters_getSupportedPreviewSizes;

    static {
        initCompatibility();
    };

    private static void initCompatibility() {
        try {
            Parameters_getSupportedPictureSizes = Camera.Parameters.class
                    .getMethod("getSupportedPictureSizes", new Class[] {});
            /* success, this is a newer device */
        } catch (NoSuchMethodException nsme) {
            /* failure, must be older device */
        }
        try {
            Parameters_getSupportedPreviewSizes = Camera.Parameters.class
                    .getMethod("getSupportedPreviewSizes", new Class[] {});
            /* success, this is a newer device */
        } catch (NoSuchMethodException nsme) {
            /* failure, must be older device */
        }
    }

    @SuppressWarnings("unchecked")
    public static List<Size> getSupportedPictureSizes(Camera.Parameters p) {
        try {
            if (Parameters_getSupportedPictureSizes != null) {
                return (List<Size>) Parameters_getSupportedPictureSizes
                        .invoke(p);
            } else {
                return null;
            }
        } catch (InvocationTargetException ite) {
            /* unpack original exception when possible */
            Throwable cause = ite.getCause();
            if (cause instanceof RuntimeException) {
                throw (RuntimeException) cause;
            } else if (cause instanceof Error) {
                throw (Error) cause;
            } else {
                throw new RuntimeException(ite);
            }
        } catch (IllegalAccessException ie) {
            System.err.println("unexpected " + ie);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public static List<Size> getSupportedPreviewSizes(Camera.Parameters p) {
        try {
            if (Parameters_getSupportedPreviewSizes != null) {
                return (List<Size>) Parameters_getSupportedPreviewSizes
                        .invoke(p);
            } else {
                return null;
            }
        } catch (InvocationTargetException ite) {
            /* unpack original exception when possible */
            Throwable cause = ite.getCause();
            if (cause instanceof RuntimeException) {
                throw (RuntimeException) cause;
            } else if (cause instanceof Error) {
                throw (Error) cause;
            } else {
                /*
                 * unexpected checked exception; wrap and re-throw
                 */
                throw new RuntimeException(ite);
            }
        } catch (IllegalAccessException ie) {
            return null;
        }
    }
}

推荐答案

请求的预览大小无效:320x402

Invalid preview size requested: 320x402

您不能使用任意预览尺寸.您需要使用 Camera.Parameters.getSupportedPreviewSizes() 和 Camera.Parameters.getSupportedPictureSizes() 来找到最接近所需尺寸的预览和图片尺寸.

You can't use arbitrary preview sizes. You'll need to use Camera.Parameters.getSupportedPreviewSizes() and Camera.Parameters.getSupportedPictureSizes() to find the closest preview and picture size to your desired size.

这篇关于Android 2.2 SDK - Nexus One 上的相机 API 的 setParameters 失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How can I use CClistview in COCOS2d Android?(如何在 COCOS2d Android 中使用 CClistview?)
cocos2d-android: how to display score(cocos2d-android:如何显示分数)
Sqlite database not copied from asset folder Android(Sqlite 数据库未从资产文件夹 Android 复制)
SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator(SQLite 数据库副本在由设备而不是模拟器生成时出现损坏)
Android file copy(安卓文件拷贝)
Android how to detect Copy event of Edittext in android(Android如何在android中检测Edittext的Copy事件)