在Android中获取首选屏幕亮度

时间:2010-12-28 09:23:01

标签: android preferences brightness

如何在Android中获得首选屏幕亮度?

要更改屏幕亮度,请使用WindowManager.LayoutParams.screenBrightness。根据文件:

  

这可以用来覆盖   用户首选的亮度   屏幕。小于0的值,   默认,表示使用首选   屏幕亮度。 0到1调整   亮度从暗到亮。

screenBrightness小于0时,我想从首选的屏幕亮度开始。我怎样才能得到这个值?

2 个答案:

答案 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); 

目前的实际亮度是什么,由自动模式或应用程序设置它自己的亮度设置是一个不同的问题,我也会对答案感兴趣。