简体   繁体   English

Android 2.3.4在Camera.setParameters上崩溃

[英]Android 2.3.4 Crashes on Camera.setParameters

I have a camera app that works on most phone but I got an error from a user today. 我有一个适用于大多数手机的相机应用程序,但我今天收到了用户的错误。 The error says that the app crashes on Camera.setParameters() I have read This StackOverflow Post about the topic, but have that same solution already implemented. 错误说应用程序在Camera.setParameters()上崩溃我已经阅读了关于该主题的StackOverflow帖子 ,但是已经实现了相同的解决方案。

Here's the code I'm using: 这是我正在使用的代码:

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; 

    }

My thought is to put a try / catch around the camera.setParameter(size.width, size.height) but I don't know if that will keep it from crashing upon failure? 我的想法是在camera.setParameter(size.width, size.height)周围放置一个try / catch但我不知道是否会在失败时使其崩溃?

Here is the Crash Log that was sent to me on developer.android.com: 以下是在developer.android.com上发送给我的崩溃日志:

java.lang.RuntimeException: setParameters failed at android.hardware.Camera.native_setParameters(Native Method) at android.hardware.Camera.setParameters(Camera.java:953) at net.feltpad.mosaic.Preview.surfaceChanged(CameraPreview.java:145) at android.view.SurfaceView.updateWindow(SurfaceView.java:557) at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.View.draw(View.java:6988) at android.widget.FrameLayout.draw(FrameLayout.java:357) at android.view.ViewGroup.drawChild(ViewGroup.java:1732) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android. java.lang.RuntimeException:set.ramerameters在android.hardware.Camera.setParameters(Native Method)的android.hardware.Camera.setParameters(Camera.java:953)net.feltpad.mosaic.Preview.surfaceChanged(CameraPreview.java: 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.drawChild的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.drawChild(ViewGroup.java:1730)上查看.ViewGroup.dispatchDraw(ViewGroup.java:1459) (ViewGroup.java:1730)android.view.frameLayout.draw(FrameLayout.java)在android.view.View.draw.draw(View.java:6988)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 357)在android.view.ViewGroup.DavatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.GoChild(ViewGroup.java:1759)上的android.view.ViewGroup.drawChild(ViewGroup.java:1732)。 view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.ViewGroup.drawChild(ViewGroup.java:1730) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.View.draw(View.java:6988) at android.widget.FrameLayout.draw(FrameLayout.java:357) at android.view.ViewGroup.drawChild(ViewGroup.java:1732) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) at android.view.View.draw(View.java:6988) at android.widget.FrameLayout.draw(FrameLayout.java:357) at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1961) at android.view.ViewRoot.draw(ViewRoot.java:1602) at android.view.ViewRoot.performTraversals(ViewRoot.java:1323) at android.view.ViewRoot.handleMessage(ViewRoot.java:1961) at android.os.Handler.dispa 在Android.view.ViewGroup.drawChild的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.drawChild(ViewGroup.java:1730)上查看.ViewGroup.dispatchDraw(ViewGroup.java:1459) (ViewGroup.java:1730)位于android.view.ViewGroup.DispatchDraw上的android.view.ViewGroup.DispatchDraw(ViewGroup.java:1459)上的android.view.ViewGroup.DavatchDraw(ViewGroup.java:1730) 1459)在android.view.View.View.draw(View.java:6988)的android.widget.FrameLayout.draw(FrameLayout.java:357)android.view.ViewGroup.drawChild(ViewGroup.java:1732)。在.android.internal.policy的android.widget.FrameLayout.draw(FrameLayout.java:357)的android.view.View.draw(View.java:6988)上的view.ViewGroup.dispatchDraw(ViewGroup.java:1459) .impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1961)在Android.view上的android.view.ViewRoot.performTraversals(ViewRoot.java:1323)的android.view.ViewRoot.draw(ViewRoot.java:1602)。在android.os.Handler.dispa上的ViewRoot.handleMessage(ViewRoot.java:1961) tchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:4333) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) tchMessage(Handler.java:99)位于android.app.Looper.loop(Looper.java:150)的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)

This code assumes that you can just set result.width to some dynamically-computed value. 此代码假定您可以将result.width设置为某个动态计算值。 This will not work on all devices. 这不适用于所有设备。 The result must be one of the values returned by getSupportedPreviewSizes() to work reliably across all devices, and in your case, it is not necessarily one of those values. result 必须getSupportedPreviewSizes()返回的值之一才能在所有设备上可靠地工作,在您的情况下,它不一定是其中一个值。

You can have an extended class for CameraHost. 您可以拥有CameraHost的扩展类。 Within this class you can override the adjustPreviewParameters functions which result in the wrong result size. 在此类中,您可以覆盖adjustPreviewParameters函数,这会导致错误的结果大小。 Below is my fix for camera preview: 以下是我对相机预览的修复:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM