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

标签 android camera orientation

我已经创建了一个相机应用程序,我希望我的应用程序可以在所有 4 个可能的方向上转动,并相应地更新相机预览。为此,我使用了以下我复制的方法: Android - Camera preview is sideways

 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();
        }
    }
}

我调整了这些值,在 samsung galaxy tab2 上测试它们,最终获得正确的方向,一切正常。当我在 htc one 的手机上尝试它时,它根本不起作用!!!!!!所有电子方向都是完全错误的!所以我得出的结论是必须有两种类型的设备(或更多......请不要!)因为旋转表示屏幕从其“默认”位置旋转了多少度然后一些设备有一个默认位置和其他人。我怎样才能找到这个默认轮换并在我的代码中采取相应的行动? ej: defaultOrientation=一些代码 如果(默认方向==0)... 否则....

锁定屏幕方向是不可能的。 目标 api>=11 非常感谢

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

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 和 samsung galaxy tab 上工作得更好,只要我们不在纵向模式下颠倒旋转手机

最佳答案

您需要考虑的因素是:设备的方向、屏幕和摄像头之间的角度(假设您使用的是后置摄像头)以及是否启用 Activity 来感知方向变化。

而且很重要的一点是厂商实现的Camera HAL代码是否符合谷歌的协议(protocol)。

关于Android:相机预览的屏幕方向/旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495489/

相关文章:

SwiftUI:如何在纵向模式下锁定特定 View ,同时允许其他人更改方向?

android - .takePicture 上的相机错误 100 仅在停止视频录制后

android - 检测使用 Rect 变换绘制的位图的触摸

java - 如何获得 for 循环中所有项目的总金额?

android - 关于android中的共享首选项

ios - 如何确保 SceneKit 相机始终指向特定位置

android - 我可以更改 Android 设备的 LED 强度吗?

ios - io6 允许基于某些条件的界面方向

swift - UISearchController SearchBar 在旋转期间处于事件状态时未对齐

java - 在 Android 应用程序的目录中列出文件时出现幻像空指针异常