首页 文章

Android 2.3.4在Camera.setParameters上崩溃

提问于
浏览
4

我有一个适用于大多数手机的相机应用程序但我今天收到了用户的错误 . 错误说应用程序在 Camera.setParameters() 崩溃了我已经阅读了关于该主题的This StackOverflow Post,但已经实现了相同的解决方案 .

这是我正在使用的代码:

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

        camera.setDisplayOrientation(90);
        Camera.Parameters parameters = camera.getParameters();
        Camera.Size size = getBestPreviewSize(w, h);    
        parameters.setPreviewSize(size.width, size.height); // preview size
        camera.setParameters(parameters);
        camera.startPreview();


        Camera.Parameters parameters = camera.getParameters();
        List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();

        // You need to choose the most appropriate previewSize for your app
        Camera.Size previewSize = // .... select one of previewSizes here


    }


private Camera.Size getBestPreviewSize(int width, int height)
    {

        // Get For Photo Size
        Camera.Parameters camparams = camera.getParameters();

        // Find the Best Preview Size
        List<Size> sizes = camparams.getSupportedPreviewSizes();

        Camera.Size result=null;
        int finalHeight = 0;
        for (Size s : sizes) {

            if (s.width <= width && s.height <= height) {
                if (result == null) {
                        result = s;
                        finalHeight = s.height;
                } else {
                        int resultArea=result.width*result.height; 
                        int newArea=s.width*s.height;

                        if (newArea>resultArea) {
                      result=s;
                      finalHeight = s.height;
                     }
                }
            } 
        }

        // Just in case... 
        if (result == null) {
            finalHeight = height;
        }

        result.width = (int)(finalHeight*cameraRatio);


        return result; 

    }

我的想法是在 camera.setParameter(size.width, size.height) 周围放一个 try / catch 但是我不知道这是否能防止它在失败时崩溃?

以下是在developer.android.com上发送给我的崩溃日志:

java.lang.RuntimeException:在android.hardware.Camera.setParameters(Camera.java:953)的android.hardware.Camera.native_setParameters(Native Method)的net.feltpad.mosaic.Preview.surfaceChanged(CameraPreview.java)中,setParameters失败:145)在android.view.SurfaceView.updateWindow(SurfaceView.java:557)android.view.SurfaceView.dispatchDraw(SurfaceView.java:348)在android.view.ViewGroup.drawChild(ViewGroup.java:1730)在android .view.ViewGroup.dispatchDraw(ViewGroup.java:1459)位于android.view.View上的android.view.ViewGroup.DispatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.drawChild(ViewGroup.java:1730) . drawChild(ViewGroup.java:1730)位于android.view.FrameLayout.draw(FrameLayout.java)android.view.View.draw(View.java:6988)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) :357)在android.view.ViewGroup.drawChild(ViewGroup.java:1732)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)at android.view.ViewGroup.drawChild(ViewGroup.java:1730)atroro d.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)位于android.view.View上的android.view.ViewGroup.DispatchDraw(ViewGroup.java:1459)上的android.view.ViewGroup.drawChild(ViewGroup.java:1730) .drawChild(ViewGroup.java:1730)位于android.view.ViewGroup.DispatchDraw(ViewGroup.java:1459),位于android.view.ViewGroup.DavatchDraw上的android.view.ViewGroup.drawChild(ViewGroup.java:1730) . java:1459)在android.view.View.View.Go(ViewView.java:1732)的android.view.FreeLayout.draw(FrameLayout.java:357)的android.view.View.draw(View.java:6988)在android.view.View.draw(View.java:6988)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)位于com.android.internal的android.widget.FrameLayout.draw(FrameLayout.java:357) .policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1961)位于android.view.ViewRoot.performTraversals(ViewRoot.java:1323)的android.view.ViewRoot.draw(ViewRoot.java:1602) . android.os.Handler.dis上的view.ViewRoot.handleMessage(ViewRoot.java:1961) android.app.Looper.loop(Looper.java:150)上的patchMessage(Handler.java:99)位于android.app.ActivityThread.main(ActivityThread.java:4333)的java.lang.reflect.Method.invokeNative(Native)方法)在com.android.internal.os.ZygoteInit的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)的java.lang.reflect.Method.invoke(Method.java:507)上.main(ZygoteInit.java:597)at dalvik.system.NativeStart.main(Native Method)

2 回答

  • 1

    此代码假定您可以将 result.width 设置为某个动态计算值 . 这不适用于所有设备 . result 必须是 getSupportedPreviewSizes() 返回的值之一才能在所有设备上可靠地工作,在您的情况下,它不一定是其中一个值 .

  • 0

    您可以拥有CameraHost的扩展类 . 在此类中,您可以覆盖adjustPreviewParameters函数,这会导致错误的结果大小 . 以下是我对相机预览的修复:

    @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);
    }
    

相关问题