我只想获取设备的旋转状态而不旋转屏幕 Xamarin.Forms

I only want to get the rotation status of the device without rotating the screen at Xamarin.Forms

我正在使用 Xamarin.Forms 构建一个多页面应用程序。 基本上,这是一个非旋转设置。

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity

但是,我们只想在相机页面上获取设备的旋转状态。 所以,在相机页面,我们调用下面的方法

private int  GetDeviceRotation()
{
    var activity = (Android.App.Activity)this.owner.Activity;
    activity.RequestedOrientation = Android.Content.PM.ScreenOrientation.Sensor;

    // Get Metrics
    var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
    var rotation = mainDisplayInfo.Rotation == DisplayRotation.Rotation0 ? 0 :
                   mainDisplayInfo.Rotation == DisplayRotation.Rotation90 ? 90 :
                   mainDisplayInfo.Rotation == DisplayRotation.Rotation180 ? 180 : 270;

    activity.RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;
    return rotation;
}

但是这种方法拍照的时候屏幕会旋转一会。 不需要旋转屏幕。

只想获取设备旋转状态,不旋转屏幕

var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var rotation = mainDisplayInfo.Rotation;

如果您只使用 mainDisplayInfo 而没有 activity.RequestedOrientation,则旋转始终为 0。 请帮我。 感谢阅读。

你可以用 OrientationEventListener 来做到这一点。

自定义一个 MyOrientationEventListener 扩展 OrientationEventListener 并在 onCreate 方法中实例化它。

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    private OrientationEventListener orientationEventListener;
    public static int currentOrientation;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
           ...
  
        orientationEventListener = new MyOrientationEventListener(this);
    }

    class MyOrientationEventListener : OrientationEventListener
    {
        public MyOrientationEventListener(Context context):base(context)
        {

        }
        public override void OnOrientationChanged(int orientation)
        {
            if (orientation >= 330 || orientation < 30)
            {
                currentOrientation = (int)SurfaceOrientation.Rotation0;

            }
            else if (orientation >= 60 && orientation < 120)
            {
                currentOrientation = (int)SurfaceOrientation.Rotation90;

            }
            else if (orientation >= 150 && orientation < 210)
            {
                currentOrientation = (int)SurfaceOrientation.Rotation180;

            }
            else if (orientation >= 240 && orientation < 300)
            {
                currentOrientation = (int)SurfaceOrientation.Rotation270;

            }
        }
    }

    //Enables and disables listening
    protected override void OnResume()
    {
        base.OnResume();
        orientationEventListener.Enable();
    }

    protected override void OnPause()
    {
        base.OnPause();
        orientationEventListener.Disable();
    }

}