在miui(小米)中检测暗模式

Detect dark mode in miui (xiaomi)

我已经看到很多关于检测黑暗模式的问题,比如 on stack overflow and visited many medium blogs like How to know when you’re using dark mode programmatically and DayNight — Adding a dark theme to your app 并且在所有这些问题中,他们都执行这样的检查:

fun isNightModeEnabled(context: Context): Boolean =
    context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK) ==
            UI_MODE_NIGHT_YES

这在任何 phone 甚至是 运行 Android 的小米手机中都很好用,但在 运行 的小米智能手机phone 上却不行] MIUI.

对于小米设备 运行ning MIUI:

context.resources.configuration.uiMode = 17

context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK) = 16

UI_MODE_NIGHT_YES (32) 相比,在启用或禁用暗模式时总是 returns false。

是否真的可以检测到在此类设备上已强制执行深色模式?

根据 Chris Banes 的文章,还有另一种方法。

设置模式(深色或浅色):

AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES) // or MODE_NIGHT_NO or MODE_NIGHT_AUTO for system defaults

然后你就可以玩资源了,深色或浅色。不确定这种从上下文中检查暗模式的方式是否仍然相关。我没有那个信息。

按照上面的逻辑,判断应用是否处于深色模式:

if (AppCompatDelegate.getDefaultNightMode() == MODE_NIGHT_YES) //or other constants

据我所知,默认的是MODE_NIGHT_NO

经过多次测试,我发现只有在尝试禁用暗模式时才会失败:

AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)

在那种情况下,该方法错误地返回它未处于黑暗模式。 所以我所做的是在应用程序主题上也强制禁用暗模式:

<item name="android:forceDarkAllowed">false</item>

这真的会停止带有 MIUI 的设备的深色模式。

如果您不想禁用暗模式,则通过前面提到的方式检测当前主题应该没有问题:

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme
}

这是docs

中描述的那个