【问题标题】:Issue on Setting Brightness on some Android device在某些 Android 设备上设置亮度的问题
【发布时间】:2013-12-06 00:39:27
【问题描述】:

我在尝试设置屏幕亮度时遇到问题。为此,我使用以下代码:

Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness); 

其中brightness 是一个介于 0 和 255 之间的值。

问题是它在某些设备上可以工作(Htc One、Nexus 5、...),而在其他设备上却不行!例如,如果我使用此功能在三星设备中设置屏幕亮度,屏幕不会变亮或变暗,但如果我进入“通知面板”(从屏幕顶部向下滑动),我可以看到亮度级别有改变了。

有人知道设置适用于所有 Android 设备的亮度的方法吗?有谁知道为什么它在某些设备上有效,而在其他设备上却不行?

UPDATE 1:

此方法用于广播接收器,因此没有活动!

【问题讨论】:

  • 哪些设备有这个问题?任何特定品牌或安卓版本?
  • 我测试过的每个 Android 版本(全部 4.0 +)上的每个三星设备。
  • 您是否尝试过在设置亮度后启动虚拟活动?这里提到了这种方法:Link.
  • @user2558882 是但没有结果!

标签: android settings android-settings


【解决方案1】:

您可以覆盖当前窗口的亮度,而不是更改亮度设置。

    WindowManager.LayoutParams lp = getWindow().getAttributes();
    if (overrideBrightness)
        lp.screenBrightness =  BRIGHTNESS_OVERRIDE_FULL;
    else 
        lp.screenBrightness =  BRIGHTNESS_OVERRIDE_NONE;
    getWindow().setAttributes(lp);

【讨论】:

  • 没有活动!只是一个广播接收器
  • 这在所有 API 级别上都足够了:window.attributes.screenBrightness = 0.25f
【解决方案2】:

更改亮度的系统设置可能会起作用,但不会触发屏幕亮度实际更改。 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" />

在 sn-p 中,DISPLAY 是一个简单的开关,用于启用显示覆盖窗口以进行测试。 (您应该会看到一个半透明的红色叠加层。)

【讨论】:

  • “系统模式窗口”是什么意思?这是一种活动?
  • 从某种意义上说,它有点灰色地带。活动负责与 WindowManager 通信以在窗口装饰中显示视图。但是,您可以直接与其交互以添加视图,而不是创建活动。该视图添加了 LayoutParams,指定它是不可见的,覆盖所有其他应用程序,不拦截触摸或焦点,并指定屏幕亮度。
  • 这会导致手机速度太慢。它工作正常,没什么好说的,但不能开发出让手机运行那么慢的东西!
  • 单个叠加层应该不会对性能产生重大影响,因为它的尺寸为零并且 PixelFormat 是半透明的。如果您多次执行此操作,您当然应该重用视图,否则您将创建多个系统模式窗口堆栈。您多久从 BroadcastReceiver 调用一次?
  • 短时间内多次。那么如何复用视图呢?
猜你喜欢
  • 1970-01-01
  • 2021-03-14
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多