android 通过悬浮窗调节屏幕亮度

来源:互联网 发布:java视频推荐 编辑:程序博客网 时间:2024/06/11 22:21

网上大部分文章是通过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){//自动调节亮度 ,先设置为150SystemSettings.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中的一个静态变量,也可以通过初始化传入contextfloatView = 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);}}