首页 > 代码库 > Android 强制获取屏幕方向

Android 强制获取屏幕方向

    最近在做照相机功能,简单的封装系统相机,遇到一个问题就是无法获取屏幕的当前方向导致屏幕旋转之后无法获得正确的方向,所以照片方向不对。

    在网上查了一下都是通过windowManager的Display或Configuration的getOrientation方法获取当前屏幕方向。但是问题来了,两种方法要求Activity不能固定方向,且需要系统打开自动旋转才能获取正确的值,否则会返回一个固定值。

    搜来搜去也就只有这两种答案,我考虑只能用监听方向传感器来实现了,但是android orientation sensor对屏幕方向几乎是不支持的。最后在API文档里翻出来OrientationEventListener这个东西,看看文档之后觉得这玩意简直太科学了,比用windowManager/Configuration/orientationSensor科学多了,但是网上找不到介绍他的文章,真是好可惜!

    

    要实现OrientationEventListener需要创建一个成员变量:

OrientationEventListener mScreenOrientationEventListener;
    对他初始化:

this.mScreenOrientationEventListener = new OrientationEventListener(mActivity) {
            @Override
            public void onOrientationChanged(int i) {
                // i的范围是0~359
                // 屏幕左边在顶部的时候 i = 90;
                // 屏幕顶部在底部的时候 i = 180;
                // 屏幕右边在底部的时候 i = 270;
                // 正常情况默认i = 0;

                if(45 <= i && i < 135) {
                    mScreenExifOrientation = ExifInterface.ORIENTATION_ROTATE_180;
                } else if(135 <= i && i < 225) {
                    mScreenExifOrientation = ExifInterface.ORIENTATION_ROTATE_270;
                } else if(225 <= i && i < 315) {
                    mScreenExifOrientation = ExifInterface.ORIENTATION_NORMAL;
                } else {
                    mScreenExifOrientation = ExifInterface.ORIENTATION_ROTATE_90;
                }
            }
        };

    这样无论屏幕有没有固定方向,无论系统有没有设定允许屏幕自动旋转都能获取到屏幕当前的方向了!

    开启监听的时候调用listener.enable(), 不需要监听的时候listener.disable()就好了。

Android 强制获取屏幕方向