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

pep*_*umo 2 android miui xiaomi android-darkmode

我已经看到了有关检测暗模式就像许多问题这一个在堆栈溢出,并参观了许多媒体的博客喜欢如何当你使用暗模式编程了解DayNight -添加一个黑暗的主题,你的应用程序,并在所有这些他们执行像这样的支票:

fun isNightModeEnabled(context: Context): Boolean =
    context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK) ==
            UI_MODE_NIGHT_YES
Run Code Online (Sandbox Code Playgroud)

这适用于任何手机,甚至运行 Android One 的小米手机,但不适用于运行 MIUI 的小米智能手机。

对于运行 MIUI 的小米设备:

context.resources.configuration.uiMode = 17

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

相比之下,UI_MODE_NIGHT_YES (32)启用或禁用暗模式时总是返回 false。

是否真的可以检测到此类设备已强制启用暗模式?

pep*_*umo 5

经过多次测试,我发现它仅在尝试通过执行以下操作禁用暗模式时失败:

AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
Run Code Online (Sandbox Code Playgroud)

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

<item name="android:forceDarkAllowed">false</item>
Run Code Online (Sandbox Code Playgroud)

这确实停止了带有 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
}
Run Code Online (Sandbox Code Playgroud)

这是文档中描述的那个