Xamarin (Android):检测设备是否有显示缺口

Xamarin (Android): Detect if the device has a display notch or not

我正在尝试检测 运行 我的应用所在的设备是否有缺口。

This 有我需要的东西,但我无法在 WindowInset class 中找到与 getDisplayCutout() 等效的 Xamarin。

原生 Android 和 Xamarin.Android 之间存在一些差异。

在您的情况下,Xamarin.Android 中的方法 getDisplayCutout() 是只读的 属性 调用 DisplayCutout

public DisplayCutout DisplayCutout { get; }

您可以像

一样访问它
Android.Views.WindowInsets window = new WindowInsets(cpoySrc);
var Cutout = window.DisplayCutout;

cpoySrc 是一个源 WindowInsets。检查 https://docs.microsoft.com/en-us/dotnet/api/android.views.windowinsets.-ctor?view=xamarin-android-sdk-9

我通过测量状态栏的大小并将其与 known/safe 阈值进行比较,设法 'solve' 这个问题。

不会声称这是该问题的最佳解决方案,但它与我目前测试过的设备相抗衡。

        private const int __NOTCH_SIZE_THRESHHOLD = 40; //dp

        /// <summary>
        /// Device has a notched display (or not)
        /// </summary>
        public bool HasNotch
        {
            get
            {

                // The 'solution' is to measure the size of the status bar; on devices without a notch, it returns 24dp.. on devices with a notch, it should be > __NOTCH_SIZE_THRESHHOLD (tested on emulator / S10)
                int id = MainActivity.Current.Resources.GetIdentifier("status_bar_height", "dimen", "android");
                if (id > 0)
                {
                    int height = MainActivity.Current.Resources.GetDimensionPixelSize(id);
                    if (pxToDp(height) > __NOTCH_SIZE_THRESHHOLD)
                        return true;
                }
                return false;
            }
        }
        /// <summary>
        /// Helper method to convert PX to DP
        /// </summary>
        private int pxToDp(int px)
        {
            return (int)(px / Android.App.Application.Context.Resources.DisplayMetrics.Density);
        }