T O P

[资源分享]     关于调节亮度在小米手机上异常的情况

  • By - 楼主

  • 2019-12-08 11:50:58
  • 最近在做播放器,其中有手指上下滑动的距离来调节播放视频页面的亮度。

    首先 来看用到的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;
        }

    测试,小米正常。

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

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册