关于调节亮度在小米手机上异常的情况

最近在做播放器,其中有手指上下滑动的距离来调节播放视频页面的亮度。

首先 来看用到的api,只修改当前页面的亮度

当前页面的亮度,取值范围0-1
/**
* This can be used to override the user's preferred brightness of
* the screen.  A value of less than 0, the default, means to use the
* preferred screen brightness.  0 to 1 adjusts the brightness from
* dark to full bright.
*/
getWindow().getAttributes().screenBrightness

看着是很简单,取到当前页面的screenBrightness值,然后增大或减小就行了,但是screenBrightness的取值可能为默认值-1,因此需要取系统设置的当前亮度值。

获取系统设置的亮度值
Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS)

官方注释,值范围为0-255
/**
* The screen backlight brightness between 0 and 255.
*/
SCREEN_BRIGHTNESS

所以那就根据取到的当前亮度值除以255得到当前的亮度,再进行亮度的修改。

但是,小米的新版系统(大概是MIUI9和MIUI10),取到的当前亮度值是远大于255的,应该是小米修改了系统亮度的最大值(不知道小米是出于什么原因修改的)。那么怎么才能得到系统的亮度最大值呢,官方是没有这个接口的,小米官网文档也没有,那只能想办法了。看了一些其他APP,例如bilibili,斗鱼,火猫,在我的小米手机上调节亮度时也是突然变为最亮然后再调节,但是MxPlayer却是正常的(不得不说好软件确实做得很细)。那就翻一下源码吧,终于找到了获取最大值的方法。

//核心代码

Resources system = Resources.getSystem();
int resId = system.getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android");
if (resId != 0) {
     return system.getInteger(resId);
}

那么就根据这些资料来完成我们的代码

    private void changeBrightness(float change) {
        float old = getWindow().getAttributes().screenBrightness;
        float none = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; // -1.0f
        if (old == none) {
            // 取到了默认值
            try {
                int current = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
                if (current <= getBrightnessMax()) {
                    old = (current * 1f) / getBrightnessMax();
                }
            } catch (Exception ignore) {
            }
        }
        if (old == none|| old <= 0) {
            // 如果没有取值成功,那么就默认设置为一半亮度,防止突然变得很亮或很暗
            old = 0.5f;
        }

        float newBrightness = MathUtils.clamp(old + change, 0.01f, 1f);
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.screenBrightness = newBrightness;
        getWindow().setAttributes(params);
    }

    /**
     * 获取最大亮度
     * @return max
     */
    private int getBrightnessMax() {
        try {
            Resources system = Resources.getSystem();
            int resId = system.getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android");
            if (resId != 0) {
                return system.getInteger(resId);
            }
        }catch (Exception ignore){}
        return 255;
    }

测试,小米正常。

其他手机也测试通过,如果有问题欢迎留言。

你可能感兴趣的:(开发随笔,Android,小米亮度,android)