【问题标题】:How to toggle auto brightness on and off? (not a repeat)如何打开和关闭自动亮度? (不重复)
【发布时间】:2012-03-09 12:18:21
【问题描述】:

我只是想打开和关闭自动亮度。 我从这段代码开始(在 onCreate 方法中)

final ToggleButton autoBrightToggle = (ToggleButton) findViewById(R.id.brightToggle);

    // display auto brightness state
    final ToggleButton autoBrightToggle = (ToggleButton) findViewById(R.id.autoToggle);
    autoOnOrOff.setText(String.valueOf(getAutoBrightnessMode()));

    autoBrightToggle.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (autoBrightToggle.isChecked()) {
                setAutoBright(true);
            } else {
                setAutoBright(false);
            }
        }
    }); // end anonymous OnClickListener function

    // toggle the brightness mode
    private void  setAutoBright(boolean mode) {
      if (mode) {
        Settings.System.putInt(cr, SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
        autoOnOrOff.setText(String.valueOf(getAutoBrightnessMode()));
      } else {
        Settings.System.putInt(cr, SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
        autoOnOrOff.setText(String.valueOf(getAutoBrightnessMode()));
      }
    }

这似乎不起作用。 setAutoBrightnessMode() 方法也会在 onResume() 中再次调用,但结果相同。 无论如何,如果有人觉得这个问题是多余的,我很抱歉,但其他帖子没有让我到达我需要去的地方!

(FWIW - 我正在我的旧 Droid X 和 Galaxy Nexus 上进行测试,而不是模拟器)

已编辑 - 更新: 我现在有 99% 的把握,我没有看到设置面板和桌面小部件中反映的自动亮度模式有任何变化 - 即使我实际上可能正在改变它的价值。 部分问题是我不知道如何准确地确定自动亮度是否开启!

例如,屏幕变化是否迅速而明显?我一直期待根据环境的亮度立即可见的变化 - 但也许这些变化是微妙的?并在更长的时间内?或者在亮度变化之前可能需要 30 秒或更长时间的环境变化?

有人可以建议我如何跟踪这个吗?我尝试查询 Settings.System.SCREEN_BRIGHTNESS_MODE 常量 - 将此方法连接到文本字段:

   private int getAutoBrightnessMode() {
     try {
        int brightnessMode = Settings.System.getInt(cr, SCREEN_BRIGHTNESS_MODE);
     } catch (Settings.SettingNotFoundException e) {
        e.printStackTrace();
        int brightnessMode = -10000;
     }
    return brightnessMode;
   }

但它总是读取 0,即使在 onResume() 之后也是如此。 :-((

我知道这是一个简单的过程,但我正在尝试自己学习这些东西,并且几乎没有接受过正式的 CS 培训......所以我只能说我对此感到非常沮丧并感到就像我已经把自己逼到了一个角落,在这一点上我很生气,我无法再思考了。

所以帮助会很棒。

【问题讨论】:

  • 什么都没有??我希望这很简单!
  • 我猜你也必须在 android manifest 中授予适当的权限(例如android.permission.WRITE_SETTINGS)。
  • 谢谢 - 我确实做到了。应该提到这一点。

标签: android settings


【解决方案1】:

我在我的应用程序中使用以下方法。在 HTC Desire HD 和一对无名中文平板电脑上测试。
添加到清单权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />

并使用下面的代码来切换自动亮度。代码中有一个技巧:我们需要手动“刷新”应用程序的亮度,因为它不会自动更改。可能是你的问题。

void setAutoBrightness(boolean value) {
    if (value) {
        Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
    } else {
        Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
    }

    // After brightness change we need to "refresh" current app brightness
    if (isChecked) {
        refreshBrightness(-1);
    } else {
        refreshBrightness(getBrightnessLevel());
    }
}

private void refreshBrightness(float brightness) {
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    if (brightness < 0) {
        lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
    } else {
        lp.screenBrightness = brightness;
    }
    getWindow().setAttributes(lp);
}

int getBrightnessLevel() {
    try {
        int value = Settings.System.getInt(getContentResolver(), SCREEN_BRIGHTNESS);
        // convert brightness level to range 0..1
        value = value / 255;
        return value;
    } catch (SettingNotFoundException e) {
        return 0;
    }
}

【讨论】:

  • 感谢您回答谢尔盖,但我不确定这是否可以解决我的问题。我可以毫不费力地让屏幕/窗口反映我使用 seekBar 对其所做的任何更改,屏幕的亮度会立即改变,而无需手动刷新窗口属性。关于自动亮度,我的代码与您的 setAutoBrightness 方法完全相同,它似乎没有做任何事情。我一直在尝试在设置亮度值后使用您的“刷新”想法,但它似乎对自动亮度是否处于自动模式没有任何影响
  • 正如我在上面提到的谢尔盖 - 你如何判断模式是否已切换?我只是在查看设置和/或我的电源设置小部件......但我开始认为它可能没有反映这些变化。所以然后我试着测试一下我自己从黑暗到光明的变化 - 但我不知道它改变亮度的速度等 - 你可以在上面看到我所要求的完整解释。
  • 这里的“isChecked”是什么意思?你在哪里设置这个变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2020-11-02
  • 2013-01-24
相关资源
最近更新 更多