网上大部分文章是通过Activity调节屏幕亮度的,但是这种亮度调节方法存在一个隐藏的bug,就是当如果当前屏幕上又一个悬浮窗,并且悬浮窗的type为WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;的时候,无论你怎么在activity中设置屏幕亮度都是无效的。猜测原因应该是由于当前的悬浮窗与设置亮度的activity处于同一个viewgroup或者悬浮窗处于更高一级的viewgroup,导致activity设置屏幕亮度无效。解决方法很简单,自己定义一个更高优先级的悬浮窗进行亮度设置,然后再移除悬浮窗就可以了。
代码如下,主要是加入一个悬浮窗
public class BrightnessSet {
private static BrightnessSet mBrightnessSet;
private Context context;
private BrightnessSet(){
init();
};
public static BrightnessSet getInstance(){
if(mBrightnessSet == null) {
mBrightnessSet = new BrightnessSet();
}
return mBrightnessSet;
}
public void setScreenBrightness(int brightness){
if(brightness < 0 || brightness > 255){
//自动调节亮度 ,先设置为150
SystemSettings.startAutoBrightness(context);//设置亮度为自动
Toast.makeText(context, R.string.system_settings_screenbrightness_auto, Toast.LENGTH_SHORT).show();
}else{
SystemSettings.stopAutoBrightness(context);
setBrightness(brightness);
SystemSettings.saveBrightness(context,brightness);//保存亮度,自定义的方法
removeFloatView();
}
}
/**
* 初始化悬浮窗
*/
private void init() {
context = MyApplication.mMyApplication;//Application中的一个静态变量,也可以通过初始化传入context
floatView = new TextView(context.getApplicationContext());
windowManager = (WindowManager) context.getApplicationContext().getSystemService(
Context.WINDOW_SERVICE);
params = new LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
params.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_NOT_TOUCHABLE;
params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
params.width = 0;
params.height = 0;
}
private TextView floatView ;
private WindowManager windowManager;
private LayoutParams params;
/**
* 创建悬浮窗,通过悬浮窗设置亮度
*/
private void setBrightness(int brightness) {
params.screenBrightness = brightness / 255;
windowManager.addView(floatView, params);
}
private void removeFloatView() {
windowManager.removeView(floatView);
}
}