在纵向模式下锁定手机时相机预览冻结

时间:2013-10-29 14:44:55

标签: android android-camera

我的应用程序中的相机存在一个小问题。当我处于预览模式并且我锁定我的手机然后将其解锁时,预览会粘贴到锁定之前预览的图像...任何想法为什么会发生这种情况?

我做了一些研究,并创建了我的活动课程。当我的清单看起来像这样时,这非常有效:

        <activity
                android:name="ro.gebs.captoom.activities.TakePicture"
                android:screenOrientation="landscape"
                android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        </activity>

但是当我有android:screenOrientation="portrait"

时无效

以下是完整代码:

 public class TakePicture extends Activity { //implements FinishTakePictureCallback {


    private SurfaceView preview = null;
    private SurfaceHolder previewHolder = null;
    private Camera camera = null;
    private boolean inPreview = false;
    private boolean cameraConfigured = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.camera_control);

        preview = (SurfaceView) findViewById(R.id.preview);
        previewHolder = preview.getHolder();
        previewHolder.addCallback(surfaceCallback);
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void onResume() {
        super.onResume();

        camera = Camera.open();
        startPreview();
    }

    @Override
    public void onPause() {
        if (inPreview) {
            camera.stopPreview();
        }

        camera.release();
        camera = null;
        inPreview = false;

        super.onPause();
    }

    private Camera.Size getBestPreviewSize(int width, int height,
                                           Camera.Parameters parameters) {
        Camera.Size result = null;

        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
            if (size.width <= width && size.height <= height) {
                if (result == null) {
                    result = size;
                } else {
                    int resultArea = result.width * result.height;
                    int newArea = size.width * size.height;

                    if (newArea > resultArea) {
                        result = size;
                    }
                }
            }
        }

        return (result);
    }

    private void initPreview(int w, int h) {
        if (camera != null && previewHolder.getSurface() != null) {
            try {
                camera.setPreviewDisplay(previewHolder);
            } catch (Throwable t) {
                Log.e("PreviewDemo-surfaceCallback",
                        "Exception in setPreviewDisplay()", t);
                Utils.showToast(TakePicture.this, t.getMessage(), Toast.LENGTH_SHORT);
            }

            if (!cameraConfigured) {
                Camera.Parameters parameters = camera.getParameters();

                List<Size> sizes = parameters.getSupportedPreviewSizes();
                for (Size size : sizes) {
                    Log.d("TakePicture", size.height + "X" + size.width + "height" + h + "width" + w);
                }
                Size optimalSize = getOptimalPreviewSize(sizes, h, w);

                parameters.setPreviewSize(optimalSize.width, optimalSize.height);
                camera.setDisplayOrientation(90);
                camera.setParameters(parameters);
                cameraConfigured = true;

            }
        }
    }

    private void startPreview() {
        if (cameraConfigured && camera != null) {
            camera.startPreview();
            inPreview = true;
        }
    }

    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio = (double) w / h;
        if (sizes == null)
            return null;

        Log.d("TakePicture", "TargetRatio: " + targetRatio);
        Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

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

        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - h) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - h);
                }
            }
        }
        Log.d("TakePicture", "The optimal size is:" + optimalSize.height + "X" + optimalSize.width);
        return optimalSize;
    }

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
        public void surfaceCreated(SurfaceHolder holder) {
            // no-op -- wait until surfaceChanged()
        }

        public void surfaceChanged(SurfaceHolder holder,
                                   int format, int width,
                                   int height) {
            initPreview(width, height);
            startPreview();
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            // no-op
        }
    };
}

提前致谢。

0 个答案:

没有答案