我在尝试设置屏幕亮度方面遇到了麻烦。为此,我使用以下代码:
Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
其中brightness
是0到255之间的值。
问题是,在某些设备中它可以工作(Htc One,Nexus 5,...),在其他设备中不行!例如,如果我使用此功能在三星设备中设置屏幕亮度,屏幕不会变得更亮或更暗,如果我进入“通知面板”(从屏幕顶部向下滑动),我可以看到亮度级别改变。
有谁知道设置适用于所有Android设备的亮度的方法?有没有人知道为什么它在某些设备上有效,但在其他设备中呢?
UPDATE 1:
此方法用于BroadcastReceiver,因此没有活动!
答案 0 :(得分:0)
您可以覆盖当前窗口的亮度,而不是更改亮度设置。
WindowManager.LayoutParams lp = getWindow().getAttributes();
if (overrideBrightness)
lp.screenBrightness = BRIGHTNESS_OVERRIDE_FULL;
else
lp.screenBrightness = BRIGHTNESS_OVERRIDE_NONE;
getWindow().setAttributes(lp);
答案 1 :(得分:0)
更改亮度的系统设置可能有效,但不会触发屏幕亮度实际更改。 WindowManager需要接收要刷新的事件as pointed out in an answer to this related question。此外,如果亮度开关设置为自动,则一旦光线传感器的值发生变化,您的设置就会被覆盖。
不幸的是,为了以某种方式使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
是一个简单的开关,可以显示覆盖窗口以进行测试。 (你应该看到一个半透明的红色覆盖层。)