4

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

这是我正在使用的代码:

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; 

    }

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

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

java.lang.RuntimeException: setParameters 在 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.dispatchDraw(ViewGroup.java:1459) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1730) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 在 android.view.ViewGroup.drawChild (ViewGroup.java:1730) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 在 android.view.View.draw(View.java:6988) 在 android.widget.FrameLayout.draw(FrameLayout.java:第357章)ViewGroup.drawChild(ViewGroup.java:1732) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1730) 在 android.view.ViewGroup.dispatchDraw(ViewGroup .java:1459) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1730) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1730)在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1730) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 在 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) 在 android.view.View.draw(View.java:6988) 在 android.widget.FrameLayout.draw(FrameLayout.java:357) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1961) 在 android.view.ViewRoot.draw(ViewRoot .java:1602) 在 android.view.ViewRoot.performTraversals(ViewRoot.java:1323) 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1961) 在 android.os.Handler.dispatchMessage(Handler.java:99)在 android.os.Looper.loop(Looper.java:150) 在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect .Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) ) 在 dalvik.system.NativeStart.main(Native Method)357) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1961) 在 android.view.ViewRoot.draw(ViewRoot.java:1602) 在 android.view.ViewRoot.performTraversals(ViewRoot .java:1323) 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1961) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:150)在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:507) 在 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)357) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1961) 在 android.view.ViewRoot.draw(ViewRoot.java:1602) 在 android.view.ViewRoot.performTraversals(ViewRoot .java:1323) 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1961) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:150)在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:507) 在 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)ViewRoot.draw(ViewRoot.java:1602) 在 android.view.ViewRoot.performTraversals(ViewRoot.java:1323) 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1961) 在 android.os.Handler.dispatchMessage(Handler .java:99) 在 android.os.Looper.loop(Looper.java:150) 在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:597) 在 dalvik.system.NativeStart.main(Native 方法)ViewRoot.draw(ViewRoot.java:1602) 在 android.view.ViewRoot.performTraversals(ViewRoot.java:1323) 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1961) 在 android.os.Handler.dispatchMessage(Handler .java:99) 在 android.os.Looper.loop(Looper.java:150) 在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:597) 在 dalvik.system.NativeStart.main(Native 方法)99) 在 android.os.Looper.loop(Looper.java:150) 在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang .reflect.Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java :597) 在 dalvik.system.NativeStart.main(Native Method)99) 在 android.os.Looper.loop(Looper.java:150) 在 android.app.ActivityThread.main(ActivityThread.java:4333) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang .reflect.Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java :597) 在 dalvik.system.NativeStart.main(Native Method)

4

2 回答 2

1

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

于 2012-10-27T07:44:44.683 回答
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);
}
于 2015-03-19T04:27:20.087 回答