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

14

我创建了一个相机应用程序,希望我的应用程序可以在所有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();
        }
    }
}

我已经调整了数值,在三星Galaxy Tab2上进行测试,最终获得了正确的方向,并且一切都正常工作。但当我在HTC One S手机上尝试时,完全不起作用!!! 所有的方向都是完全错误的!因此,我得出结论,可能有2种类型的设备(或更多……请不要!),因为旋转表示屏幕从其“默认”位置旋转了多少度,因此某些设备具有一种默认位置,而其他设备则具有另一种默认位置。 我该如何找出这个默认旋转并在我的代码中相应地采取行动呢? 例如: defaultOrientation=某些代码 if(defaultOrientation==0) ... else ....

锁定屏幕方向是不可能的。 目标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 和三星 Galaxy Tab 上的表现更佳。


1
我认为,为了正确实现此功能,你还需要计算设备的高度/宽度...通过角度和设备当前的高度/宽度的组合,你将能够确定视图的精确位置。 - dreamcoder
使用ExifInterface获取方向..对我来说它运行良好,但我尚未在任何HTC设备上测试过我的代码。 - Biplab
2种类型的设备:https://dev59.com/OFsW5IYBdhLWcg3wFj5p#35431231 - Alex Cohn
1个回答

0

你需要考虑的因素包括:设备的方向,屏幕和相机之间的角度(假设你正在使用后置摄像头),以及是否启用活动来感知方向变化。

还有一件重要的事情是制造商实现的相机 HAL 代码是否符合 Google 的协议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接