如何在Android中获得首选屏幕亮度?
要更改屏幕亮度,请使用WindowManager.LayoutParams.screenBrightness。根据文件:
这可以用来覆盖 用户首选的亮度 屏幕。小于0的值, 默认,表示使用首选 屏幕亮度。 0到1调整 亮度从暗到亮。
当screenBrightness
小于0时,我想从首选的屏幕亮度开始。我怎样才能得到这个值?
答案 0 :(得分:38)
我会尝试回答,因为我前段时间已经搜索过了。我的简短答案是:经过大量研究后,我从未找到过在自动模式下获得当前亮度级别的方法。
我会把它分成多个答案。我不会跳过场所,因此谷歌可以发现这有用。跳过你不需要的东西。
1-获取亮度设置值
当
screenBrightness
小于0时,我想从首选的屏幕亮度开始。我怎样才能得到这个值?
对于拥有这么多声誉的人,我相信你已经知道了关于搜索的练习。 SO上有很多关于此的答案。只需使用类似的问题检查右侧面板......说,我不会详细说明。
int oldBrightness = Settings.System.getInt(getContext().getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS);
这就是Android BrightnessPreference.java
在2.3.5中的表现(见第68行)。 lfor发布的内容也是一样的(出于实际原因)。
它没有被命名为旧亮度。这是存储在某处的设置,而不是当前值。只有当您进入手动亮度模式时,才能确定它与用户遇到的情况相同。否则,你只是不知道。你应该检查:
int mode = Settings.System.getInt(getContext().getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE);
2-听取屏幕亮度变化
众所周知,通常情况下,当我们想要收听Android中的更改时,我们可以尝试收听Intent
操作,注册BroadcastReceiver
以及所有这些操作。但是, AFAIK ,亮度变化没有ACTION_
,例如SCREEN_[ON|OFF]
。也许有一个隐藏在系统中,但我从来没有见过它,如果它不公开,你可能有处理这个问题的所有陷阱。
2010年12月,Dianne Hackborn发了一条消息,她说"there is no broadcast for screen brightness changes"。
所以,我不相信有办法连接到那样的东西。当然,您可以更改设置本身:
Settings.System.putInt(getContext().getContentResolver(),
SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
3-聆听环境光线变化
然而,你可以aprox。检测光量。您需要implements SensorEventListener
和:
// class definition:
private SensorManager sensorManager;
@Override
public void onSensorChanged(SensorEvent event) {
float values = event.values[0]; // Ambient LUX
}
// onCreate:
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_UI);
4-猜测亮度变化
毕竟,我还必须重复哈克伯恩的问题:“你想要完成什么?” (这是为赏金所有者)。我很高兴看到Android如何将环境lux映射到屏幕亮度。我很确定它不是线性的(将Sensor.getMaximumRange()
线性映射到0..1浮点间隔)。我已经看到,通常这是映射对数(提供更低的亮度范围更精细的调整),但我不知道参数。也许每个人都使用建议的默认方式,但我不是专家。
如果你能找到 Android如何通过查看它所在的来源中的位置来做到这一点,那就太棒了。但无论如何,我没有这么长时间给你留下同样的问题。我发现Sensor.getMaximumRange()
与您从SensorEvent
values[0]
获得的内容不一致。在这里,我有一个Sharp传感器(Nexus S),虽然报告最大值为3,000,但我看到的值高达10,240。
所以,让传感器不可靠(?)。我猜测,通过我用Android看到的行为,它以某种方式将getMaximumValue()映射到最大亮度,而它上面的任何值都没有区别。
5-从何处开始
我会更多地了解Android来源。在某个地方,可能是在较低级别,硬件管理的东西,你可以看到他们如何映射。考虑到Dianne Hackborn说的话,我想知道这是否可靠(他们似乎不希望你这样做)。我猜他们有理由不揭露这一点。也许需要:为什么应用程序必须知道系统设置?它要么需要提供他自己的应用范围级别,要么在极端情况下,为系统范围的替换或管理者提供自己的“自动生成改变方法”(如上面第4点所述)。也许这就是原始开发人员的想法。
无论如何,如果有人发现其他细节,我会非常高兴知道。
答案 1 :(得分:-2)
很好回答问题,你可以从Settings.system.SCREEN_BRIGHTNESS获得优先亮度。范围看起来是0-255。
int UserBrightness = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS,-1);
目前的实际亮度是什么,由自动模式或应用程序设置它自己的亮度设置是一个不同的问题,我也会对答案感兴趣。