最近在做播放器,其中有手指上下滑动的距离来调节播放视频页面的亮度。
首先 来看用到的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.0fif (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;}
测试,小米正常。
其他手机也测试通过,如果有问题欢迎留言。