更改亮度的系统设置可能会起作用,但不会触发屏幕亮度实际更改。正如对此相关问题的回答中所指出的,WindowManager 将需要接收要刷新的事件。此外,如果亮度开关设置为自动,则一旦光传感器的值发生变化,您的设置就会被覆盖。
不幸的是,为了以某种方式使 WindowManager 确认新的亮度设置,您需要一个活动上下文。我建议创建一个窗口,并将亮度值应用到 LayoutParams 中,而不是不必要地创建一个新活动来立即销毁它。
执行此操作的常用方法是显示系统模式窗口,并将 LayoutParams 应用于其属性:
final View view = new View(this);
int dimension = 0;
int pixelFormat = PixelFormat.TRANSLUCENT;
if (DISPLAY) {
view.setBackgroundColor(Color.argb(128, 255, 0, 0));
dimension = LayoutParams.MATCH_PARENT;
pixelFormat = PixelFormat.RGBA_8888;
}
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
dimension, dimension,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
pixelFormat);
// 0f = minimum brightness; 1f = maximum brightness
float brightness = 1f;
params.screenBrightness = brightness;
Settings.System.putInt(cResolver,
Settings.System.SCREEN_BRIGHTNESS, 255 * brightness);
final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(view, params);
您需要在清单中添加以下权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
在代码段中,DISPLAY
是一个简单的开关,用于启用显示覆盖窗口以进行测试。(您应该看到一个半透明的红色覆盖层。)