安卓如何检测是否为夜间模式?

10

有没有比这个更好的方法?

Boolean isNight;
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
if(hour < 6 || hour > 18){
    isNight = true;
} else {
    isNight = false;
}

它只检查小时数是否在晚上7点到早上5点之间。还有其他方法可以做到这一点吗?


1
好的,你可以使用设备的相机来评估周围的明暗程度,结合测量GPS获取位置修复所需的时间作为提示,以确定用户是否真的在户外... 不,我不是认真的 :) 像你目前这样的简单解决方案(除了一些明显的修复,比如使用“布尔”并摆脱“if”)很可能是你能得到的最好的解决方案。 - Xion
1
有没有办法检测设备当前是否处于夜间模式? 我看到有一种方法可以更改设备模式,但我不知道如何读取当前模式。 http://developer.android.com/reference/android/app/UiModeManager.html - OlivierM
你找到解决方案了吗?我也在尝试解决同样的问题。UiModeManager似乎没有什么帮助。 - Russell Stewart
@mstewart 不需要太高的准确度,所以我只是根据一天中的小时数分配了真/假值。我想你可以将其与某种天气服务的日落本地时间查询相结合,但我并不打算深入研究它。 - aperture
3个回答

8

虽然差异不大,但是你可以进行赋值操作:

isNight = hour < 6 || hour > 18;

我目前是这样做的,但我认为它太不准确了,特别是当你接近极地时。理想情况下,需要检查小时数、纬度和月份(可能还有某些国家的特殊规定)。编辑:或者具有夏季和冬季默认值,并让用户进行调整。 - Ray Britton

3

values\values.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isNightMode">false</bool>
</resources>

values-night\values.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isNightMode">true</bool>
</resources>

现在,在您的class.java文件中检查它。
public boolean isNightMode(){
    return getResources().getBoolean(R.bool.isNightMode);
}

2
如果您使用UiModeManager启用CarMode且NIGHT模式设置为AUTO,则可以通过声明要在运行时查找的属性来获取对当前主题使用情况的引用。
attrs.xml
<resources>
    <!--  Theme name reference -->
    <attr name="metaThemeName" format="string"/>
</resources>

values-night/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat">
        <item name="metaThemeName">night</item>
    </style>
</resources>

java.class

...
    TypedValue outValue = new TypedValue();
    getTheme().resolveAttribute(R.attr.metaThemeName, outValue, true);
    boolean isNight="night".equals(outValue.string);
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接