尝试确定屏幕是否关闭时检测常亮显示

Detect Always-On Display when trying to determine if the screen is off

我正在尝试弄清楚如何检测 Android 上的显示屏是否关闭,我感觉我的 S10 上的常亮显示屏正在影响我的结果。

目前,我正在使用 this Whosebug answer 中的逻辑。

还有 a comment on that thread that says you should be able to use Display.FLAG_PRIVATE 用于检查三星的 Always-On Display,但没有说明具体方法。

使用这些信息,我将这个函数放在一起。但这似乎不起作用。如果我启用了常亮显示,则显示几乎总是被计为开启。

public boolean isScreenOn() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
        for (Display display : dm.getDisplays()) {
            if ((display.getFlags() & Display.FLAG_PRIVATE) != Display.FLAG_PRIVATE) {
                if (display.getState() != Display.STATE_OFF) {
                    return true;
                }
            }
        }
        return false;
    } else {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        //noinspection deprecation
        return pm.isScreenOn();
    }
}

我不确定我检查 Display.FLAG_PRIVATE 标志的方式是否正确,或者这是否会有助于影响结果的 Always-On 显示的潜力。

我发现这些标志实际上与它没有任何关系。似乎显示状态将是包括 Display.STATE_DOZE_SUSPENDED, Display.STATE_DOZE and several others when the Always-On Display is active. So instead, I'm just checking for Display.STATE_ON 在内的几种状态之一,并将所有其他状态视为显示已关闭。

public boolean isScreenOn() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
        for (Display display : dm.getDisplays()) {
            if (display.getState() == Display.STATE_ON) {
                return true;
            }
        }
        return false;
    } else {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        //noinspection deprecation
        return pm.isScreenOn();
    }
}