我会尝试回答,因为我前段时间已经搜索过了。我的简短答案是:经过大量研究,我从未找到一种方法来获得自动模式下的当前亮度水平。
我将把它分成多个答案。我不会跳过前提,以便 googlers 可以发现这很有帮助。跳过不需要的内容。
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动作,注册BroadcastReceivers等等。但是,AFAIK,没有用于亮度变化的 ACTION_,例如 SCREEN_[ON|OFF]。也许系统中隐藏了一个,但我从未见过它,如果它不公开,那么你处理它时可能会遇到所有可能的陷阱。
有一条来自 Dianne Hackborn 的消息,日期为 2010 年 12 月,她说"there is no broadcast for screen brightness changes"。
所以,我不相信有办法连接到这样的东西。当然,您可以更改设置本身:
Settings.System.putInt(getContext().getContentResolver(),
SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
3- 聆听环境光的变化
但是,您可以。检测光量。你需要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 如何将环境照度映射到屏幕亮度。我很确定这不是线性的(将Sensor.getMaximumRange() 线性映射到 0..1 浮点间隔)。我已经看到这通常是映射的对数(对较低的亮度范围提供更精细的调整),但我不知道这些参数。也许有一个建议的默认方式,每个人都使用,但我不是专家。
如果您能通过查看它在源代码中的位置找到 Android 是如何做到这一点的,那就太好了。但不管怎样,我来这么久也没有给你留下同样的问题。我发现Sensor.getMaximumRange() 与您从SensorEvent values[0] 获得的内容不一致。在这里,我有一个 Sharp 传感器 (Nexus S),虽然报告最大值为 3,000,但我看到的值高达 10,240。
因此,获取传感器并不可靠(?)。我猜测,根据我使用 Android 看到的行为,它以某种方式将 getMaximumValue() 映射到最大亮度,而高于它的任何值都没有任何区别。
5- 从这里去哪里
我会更多地研究 Android 资源。在某个地方,可能在较低级别的硬件管理中,您可以看到它们是如何映射的。不过,我想知道这是否可靠,考虑到 Dianne Hackborn 所说的话(他们似乎不希望你这样做)。我猜他们有理由不暴露这一点。或许需要:为什么app一定要知道系统设置?它要么需要提供自己的应用范围级别,要么在极端情况下为系统范围的替换或管理器提供自己的“自动亮度更改方法”(如上文第 4 点)。也许这就是最初的开发者的想法。
无论如何,如果有人发现其他细节,我会非常高兴知道。