如何编程检测Android系统是否支持深色主题?
检测系统是否支持深色主题的正确方式
你遇到的问题很典型——原来的方法之所以在Android 5(API 21)这类低版本设备上返回true,是因为Configuration.UI_MODE_NIGHT_UNDEFINED是在API 23才引入的常量,而更低版本的系统里这个值为0,和configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK的默认结果(同样是0)对比时,自然会返回true,这就造成了误判。
要准确检测系统是否支持深色主题,需要结合系统版本和UI模式的有效性来判断,具体实现如下:
public boolean isSystemDarkThemeSupported(Context context) { // Android 10(API 29)及以上系统原生支持系统级深色主题 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return true; } // 针对Android 9(API 28)及以下,判断定制系统是否实现深色主题支持 final Configuration configuration = context.getResources().getConfiguration(); final int nightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; // API 23到API 28的设备,只有nightMode不是UNDEFINED时,说明系统支持深色主题切换 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return nightMode != Configuration.UI_MODE_NIGHT_UNDEFINED; } // API 23以下的原生系统无深色主题概念,定制ROM的非标准实现无法通过通用API检测,默认返回false return false; }
补充说明:
- 原生Android在API 29(Android 10)才正式推出系统级深色主题,因此这部分可以直接返回
true。 - 对于API 23到API 28的设备,
UI_MODE_NIGHT_UNDEFINED是有效常量,通过判断nightMode是否为该值,就能识别出像MIUI 11这类基于Android 9但支持深色主题的定制系统。 - API 23以下的设备,原生系统没有夜间模式的设计,即便部分定制ROM有类似功能,也无法通过标准Android API检测,若要兼容这类场景,可能需要额外检测特定系统属性或包名,但通用性较差。
内容的提问来源于stack exchange,提问作者Alexey Nikitin
相关产品推荐
相关产品推荐

