android - 在横向模式下使用相机获取纵向预览

标签 android camera surfaceview

每当我在横向模式下使用我的相机以纵向查看时,我都会为纵向和横向模式准备两种不同的布局。

无论我是在横向还是纵向模式下使用相机,我仍然在纵向模式下获得预览,但是一旦我删除了这一行:mCamera.setDisplayOrientation(90); 我正在获得预览在横向模式下,我在横向或纵向模式下使用相机

PreviewSurface.java:-

public class PreviewSurface extends SurfaceView implements
    SurfaceHolder.Callback {

        public static final String LOG_TAG = "CameraPreview";
        private SurfaceHolder mSurfaceHolder;

        private Camera mCamera;

        // Constructor that obtains context and camera
        @SuppressWarnings("deprecation")
        public PreviewSurface(Context context, Camera camera) {
            super(context);
            this.mCamera = camera;

            this.mSurfaceHolder = this.getHolder();
            this.mSurfaceHolder.addCallback(this);
            this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            this.mSurfaceHolder.setFixedSize(100, 100);
        }

        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            try {       
                mCamera.setPreviewDisplay(surfaceHolder);
                mCamera.startPreview();

            } catch (IOException e) {
                // left blank for now
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            mCamera.stopPreview();
            mCamera.release();
        }

        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
                int width, int height) {

                // start preview with new settings
                try {
                mCamera.setDisplayOrientation(90);
                mCamera.setPreviewDisplay(surfaceHolder);
                mCamera.startPreview();
                } catch (Exception e) {
                // intentionally left blank for a test
            }
        }

最佳答案

我建议你使用:Configuration.ORIENTATION_LANDSCAPE来支持风景预览

编辑答案:

@Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        try {       
            Camera.Parameters parameters = mCamera.getParameters();
            if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                 parameters.set("orientation", "portrait");
                 mCamera.setDisplayOrientation(90);
                 parameters.setRotation(90);
            }
                 else {
                      // This is an undocumented although widely known feature
                      parameters.set("orientation", "landscape");
                      // For Android 2.2 and above
                      mCamera.setDisplayOrientation(0);
                      // Uncomment for Android 2.0 and above
                      parameters.setRotation(0);
            }
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();

        } catch (IOException e) {
            // left blank for now
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        mCamera.stopPreview();
        mCamera.release();
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
            int width, int height) {

        try {       
            Camera.Parameters parameters = mCamera.getParameters();
            if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                 parameters.set("orientation", "portrait");
                 mCamera.setDisplayOrientation(90);
                 parameters.setRotation(90);
                 mCamera.setPreviewDisplay(surfaceHolder);
                    mCamera.startPreview();
            }
                 else {
                      // This is an undocumented although widely known feature
                      parameters.set("orientation", "landscape");
                      // For Android 2.2 and above
                      mCamera.setDisplayOrientation(0);
                      // Uncomment for Android 2.0 and above
                      parameters.setRotation(0);
            }
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();

        } catch (IOException e) {
            // left blank for now
        }           
    }

关于android - 在横向模式下使用相机获取纵向预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20559112/

相关文章:

android - 如何使CircleCI使用特定的Gradle版本?

android - Gradle (Android Studio) 不会编译 9patches

android - 截取 SurfaceView 的屏幕截图

ios - 相机没有响应

android - SurfaceView 在 Android 8.0 上与另一个 SurfaceView 重叠

android - 如何获得android.Manifest.permission.MEDIA_CONTENT_CONTROL的android权限

java - 如何用动画改变 FrameLayout 的前景可绘制的 alpha?

android-camera-server-died-and-camera-error-100

android - Surfaceflinger 的界面如何工作?

android - 如何在android表面 View 中创建一个移动指针?