Как включить и выключить автояркость? (не повтор)

Я просто пытаюсь включить и выключить автояркость. Я начал с этого кода (внутри метода 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 ... Так что все, что я могу сказать, это то, что я очень разочарован этим и чувствую, что я Я загнал себя в угол, и в этот момент я так раздражен, что больше не могу ясно мыслить.

Так что помощь была бы велика.


person Bennett Von Bennett    schedule 18.02.2012    source источник
comment
ничего?? Я надеялся, что это что-то простое!   -  person Bennett Von Bennett    schedule 19.02.2012
comment
Я думаю, вам также придется предоставить соответствующие разрешения в манифесте Android (например, android.permission.WRITE_SETTINGS).   -  person barti_ddu    schedule 21.02.2012
comment
спасибо - я так и сделал. должен был упомянуть об этом.   -  person Bennett Von Bennett    schedule 21.02.2012


Ответы (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;
    }
}
person Sergey Glotov    schedule 20.02.2012
comment
спасибо за ответ Сергей, но я не уверен, что это решение моего вопроса. У меня нет проблем с тем, чтобы экран/окно отражало любые изменения, которые я вношу в него с помощью seekBar, яркость экрана меняется мгновенно, без необходимости вручную обновлять атрибуты окна. что касается автоматической яркости, у меня точно такой же код, как и у вашего метода setAutoBrightness, просто он ничего не делает. Я пытался использовать вашу идею «обновления» после установки значений яркости, но, похоже, это НИКАК не влияет на то, находится ли автояркость в автоматическом режиме или нет. - person Bennett Von Bennett; 21.02.2012
comment
как я уже упоминал выше, Сергей, как можно определить, переключился режим или нет? Я просто смотрел на Настройки и/или мой виджет Power Settings... но я начал думать, что, возможно, это не отражает изменений. поэтому я попытался просто проверить это на себе, переходя от темного к светлому, но я не знаю, как быстро он меняет яркость и т. д. - вы можете увидеть выше полное объяснение того, о чем я прошу. - person Bennett Von Bennett; 22.02.2012
comment
Что здесь означает «isChecked»? Где вы устанавливаете эту переменную? - person Deqing; 06.01.2014