4

ほとんどの電話で動作するカメラ アプリを持っていますが、今日、ユーザーからエラーが発生しました。このエラーは、トピックに関するこの StackOverflow の投稿Camera.setParameters()を読みましたが、同じソリューションが既に実装されている場合にアプリがクラッシュすることを示しています。

私が使用しているコードは次のとおりです。

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: 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) android.view で。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) で android.widget.FrameLayout.draw(FrameLayout.java:357) で android.view.ViewGroup.drawChild(ViewGroup.java:1732) で 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(ネイティブ メソッド) で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(ネイティブ メソッド) で 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(ネイティブ メソッド)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(ネイティブ メソッド) で 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(ネイティブ メソッド)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) でcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) の java.lang.reflect.Method.invoke(Method.java:507) com.android.internal.os.ZygoteInit.main( ZygoteInit.java:597) で dalvik.system.NativeStart.main (ネイティブ メソッド)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) でcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) の java.lang.reflect.Method.invoke(Method.java:507) com.android.internal.os.ZygoteInit.main( ZygoteInit.java:597) で dalvik.system.NativeStart.main (ネイティブ メソッド)99) android.os.Looper.loop(Looper.java:150) で android.app.ActivityThread.main(ActivityThread.java:4333) で java.lang.reflect.Method.invokeNative(Native Method) で java.lang com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) の .reflect.Method.invoke(Method.java:507) com.android.internal.os.ZygoteInit.main(ZygoteInit.java) :597) dalvik.system.NativeStart.main(ネイティブメソッド)99) android.os.Looper.loop(Looper.java:150) で android.app.ActivityThread.main(ActivityThread.java:4333) で java.lang.reflect.Method.invokeNative(Native Method) で java.lang com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) の .reflect.Method.invoke(Method.java:507) com.android.internal.os.ZygoteInit.main(ZygoteInit.java) :597) dalvik.system.NativeStart.main(ネイティブメソッド)

4

2 に答える 2

1

result.widthこのコードは、動的に計算された値に設定できることを前提としています。これは、すべてのデバイスで機能するわけではありません。すべてのデバイスで確実に機能するには、によって返される値の 1 つである必要があります。この場合、必ずしもこれらの値の 1 つであるとは限りませんresult getSupportedPreviewSizes()

于 2012-10-27T07:44:44.683 に答える