当前位置: 首页 > 知识库问答 >
问题:

Android:用于相机预览的屏幕方向/旋转

梁丘波鸿
2023-03-14

我创建了一个相机应用程序,我希望我的应用程序在所有4种可能的方向上打开,并相应地更新相机预览。为此,我使用了以下我复制的方法:Android-相机预览是横向的

 public void updateCameraDisplay(int w, int h) {
        // set preview size and make any resize, rotate or
        // reformatting changes here

        Log.i("CameraPreviews", "Updating camera orientation with w=" + w
                + " and h=" + h);
        Parameters parameters = camera.getParameters();
        Display display = getActivity().getWindowManager()
                .getDefaultDisplay();

        int rotation = getActivity().getResources().getConfiguration().orientation;
        Log.i("CameraPreviews", "rotation is " + display.getRotation());
        if (display.getRotation() == Surface.ROTATION_0) {

            parameters.setPreviewSize(h, w);
            camera.setDisplayOrientation(0);
        }

        if (display.getRotation() == Surface.ROTATION_90) {
            parameters.setPreviewSize(w, h);
            camera.setDisplayOrientation(270);
        }

        if (display.getRotation() == Surface.ROTATION_180) {
            parameters.setPreviewSize(h, w);
            camera.setDisplayOrientation(180);
        }

        if (display.getRotation() == Surface.ROTATION_270) {
            parameters.setPreviewSize(w, h);
            camera.setDisplayOrientation(90);
        }

        try {
            camera.setParameters(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我已经测试了这些值,并在三星galaxy tab2上进行了测试,最终获得了正确的方向,一切正常。当我在htc one的手机上试用时,它根本不起作用!!!!!所有的e方向都是完全错误的!所以我得出结论,thre必须是2种类型的设备(或更多…请不要!)因为旋转表示屏幕从其“默认”位置旋转了多少度,所以一些设备有一个默认位置,而另一些设备有另一个默认位置。我怎样才能找到这个默认的旋转并在代码中相应地执行操作?ej:defaultOrientation=一些代码,如果(defaultOrientation==0)。。。其他的

锁定屏幕方向是毫无疑问的。目标api

编辑:我已将代码修改为:

public void updateCameraDisplay(int w, int h) {
        // set preview size and make any resize, rotate or
        // reformatting changes here

        Log.i("CameraPreviews", "Updating camera orientation with w=" + w
                + " and h=" + h);
        Parameters parameters = camera.getParameters();
        Display display = getActivity().getWindowManager()
                .getDefaultDisplay();

        int rotation = getActivity().getResources().getConfiguration().orientation;
        Log.i("CameraPreviews", "screen rotation is " + rotation);
        Log.i("CameraPreviews", "display rotation is " + display.getRotation());
        if (display.getRotation() == Surface.ROTATION_0) {

            if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
                parameters.setPreviewSize(h, w);
                camera.setDisplayOrientation(0);
            } else {
                parameters.setPreviewSize(h, w);
                camera.setDisplayOrientation(90);
            }
        }

        else if (display.getRotation() == Surface.ROTATION_90) {
            if (rotation == Configuration.ORIENTATION_PORTRAIT) {
                parameters.setPreviewSize(w, h);
                camera.setDisplayOrientation(270);
            } else {
                parameters.setPreviewSize(w, h);
                //camera.setDisplayOrientation(0);
            }
        }

        else if (display.getRotation() == Surface.ROTATION_180) {
            if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
            parameters.setPreviewSize(h, w);
            camera.setDisplayOrientation(180);
            }else {
                parameters.setPreviewSize(h, w);
                camera.setDisplayOrientation(270);
            }
        }

        else if (display.getRotation() == Surface.ROTATION_270) {
            if (rotation == Configuration.ORIENTATION_PORTRAIT) {
                parameters.setPreviewSize(w, h);
                camera.setDisplayOrientation(90);
            } else {
                parameters.setPreviewSize(w, h);
                camera.setDisplayOrientation(180);
            }
        }

        try {
            camera.setParameters(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在htc one s和三星galaxy tab上工作得更好,只要我们不在纵向模式下颠倒手机

共有1个答案

戴原
2023-03-14

您需要考虑的因素包括:设备的方向、屏幕和摄像头之间的角度、假设您使用的是后置摄像头,以及您是否允许活动感知方向的变化。

一个重要的问题是,制造商实现的摄像头HAL代码是否符合谷歌的协议。

 类似资料:
  • 我使用相机仅显示预览(不拍照或录制视频)。 该应用程序始终处于竖屏状态(横向模式被禁用)。相机预览始终旋转90度ccw,我无法更改它(无论是还是和。 预览总是这样旋转还是依赖于设备?如果在纵向模式下总是这样,我可以在之后旋转图像。 或者有没有办法正确设置摄像头?我读了很多关于这个的帖子,但没有一个答案对我有用(Galaxy s2,Android v2.3)

  • 我有一个自定义的相机应用程序,我想任何预览大小显示在全屏模式下,而不拉伸相机预览图像。为此,我需要使surfaceView比屏幕更大,以保持纵横比,这样用户实际看到的比摄像机实际捕获的要少。 由于某些原因,我无法使大于屏幕大小。 到目前为止我所尝试的: > 调整相机预览在方法 但是没有任何成功-每次的行为都是一样的:1秒钟内它看起来正常,然后它就会拉伸。 下面是代码: 以下是整个项目:https:

  • 有没有人使用过这个打包的Xamrin版本?https://components.xamarin.com/view/emgucv-v3 我最近购买了这个许可证,并击中了与这里描述的完全相同的问题(旋转相机预览到肖像Android OpenCV相机)。一直在使用各种方法。 首先转屏方向从风景到肖像,但这只是以相同的旋转形式(90度)显示流。景观似乎是唯一一个我喜欢的作品。 我尝试使用相机对象旋转相机本

  • 本文向大家介绍Android改变手机屏幕朝向的方法,包括了Android改变手机屏幕朝向的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android改变手机屏幕朝向的方法。分享给大家供大家参考。具体如下: 模拟当点击按钮时,使手机朝向发生改变。 main.xml布局文件: 清单文件: OrientationActivity类: 运行结果: 希望本文所述对大家的Android程序设计

  • 我正在尝试在android studio中编写一个活动,至少在任何设备中都是类似的。为了实现这一点,我已经在使用: 约束布局 文本大小为sp,其他大小为dp 在我的android预览版和我的物理设备中使用相同的分辨率(1920x1080) 但是,我在每个屏幕上都有不同的屏幕行为,正如你可以从图片中看到的。 主要区别在于: 文本大小似乎不同,即使使用sp单位来定义它; 手机有换行符,但没有预览; 与

  • 我试图在用户拍照时检测相机方向,以便在画布上绘制时进行调整。问题是我不能使用设备方向,因为即使方向锁定打开,我也需要它才能工作。 摄像机设置 视频流快照 来自David Walsh的参考代码 - 浏览器摄像头