Подтвердить что ты не робот

Получите предпочтение яркости экрана в Android

Как вы получаете предпочтительную яркость экрана в Android?

Чтобы изменить яркость экрана, я использую WindowManager.LayoutParams.screenBrightness. Согласно документации:

Это можно использовать для переопределения пользовательская яркость экран. Значение меньше 0, по умолчанию, означает использование предпочтительного яркость экрана. От 0 до 1 регулирует яркость от темноты до полной яркости.

Когда screenBrightness меньше 0, я хотел бы начать с предпочтительной яркости экрана. Как я могу получить это значение?

4b9b3361

Ответ 1

Я постараюсь ответить, потому что я уже искал это некоторое время назад. Мой короткий ответ: Я не нашел способ получить текущий уровень яркости при автоматическом режиме после обширных исследований.

Я разбиваю это на несколько ответов. Я не буду пропускать помещения, так что гуглеры могут найти это полезным. Пропустите то, что вам не нужно.

1- Получить значение настройки яркости

Когда screenBrightness меньше 0, я хотел бы начать с предпочтительной яркости экрана. Как я могу получить это значение?

Для человека, который имеет такую ​​репутацию, я уверен, что вы уже знаете упражнение о поиске. Тут есть тонны ответов об этом здесь. Просто проверьте правильную панель с похожими вопросами... что я не буду подробно описывать.

int oldBrightness = Settings.System.getInt(getContext().getContentResolver(), 
             Settings.System.SCREEN_BRIGHTNESS);

Вот как Android BrightnessPreference.java делает это в 2.3.5 (см. строку 68). Это также одно и то же (по практическим соображениям) то, что было опубликовано.

Он не назвал старую яркость ни за что. Это параметр, который хранится где-то, а не текущее значение. Вы можете быть уверены, что это то же самое, что и пользователь, если вы находитесь в режиме ручной яркости. В противном случае вы просто не знаете. Вы должны проверить:

int mode = Settings.System.getInt(getContext().getContentResolver(),
                     Settings.System.SCREEN_BRIGHTNESS_MODE);

2- Прослушивание изменений яркости экрана

Как мы знаем, обычно, когда мы хотим слушать изменения в Android, мы можем попробовать прослушать Intent действия, зарегистрировав BroadcastReceiver и все такое. Однако AFAIK для изменения яркости нет ACTION_, например SCREEN_[ON|OFF]. Возможно, в системе есть один скрытый, но я его никогда не видел, и если он не является общедоступным, у вас есть все возможные проблемы с этим.

От Дайанн Хакборн есть сообщение от декабря 2010 года, где она говорит, что "нет трансляции для изменения яркости экрана" .

Итак, я не верю, что есть способ подключиться к чему-то подобному. Конечно, вы можете сами изменить настройку:

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), и хотя отчет max 3000, я видел значения до 10 240.

Таким образом, получение датчика не является надежным (?). Я предполагаю, что поведением, которое я видел с помощью Android, так или иначе он сопоставляет getMaximumValue() с максимальной яркостью, и любое значение над ним просто не имеет значения.

5- Куда пойти отсюда

Я бы посмотрел больше на Android-источники. Где-то, возможно, на более низком уровне, аппаратное управление, вы могли бы увидеть, как они отображаются. Тем не менее, мне интересно, насколько это надежно, учитывая то, что сказала Диана Хакборн (они, похоже, не хотят, чтобы вы это делали). Думаю, у них была причина не раскрывать это. Возможно, нужно: почему приложение должно знать настройки системы? Он должен либо предоставить свой собственный уровень приложения, либо в крайнем случае предоставить свой собственный метод изменения автоматической видимости (как в пункте 4 выше) для общесистемной замены или менеджера. Возможно, это то, что думали оригинальные разработчики.

В любом случае, если кто-нибудь найдет другие подробности, я был бы очень рад узнать.

Ответ 2

Хорошо, чтобы ответить на заданный вопрос, вы можете получить предпочтительную яркость от Settings.system.SCREEN_BRIGHTNESS Диапазон выглядит 0-255.

int UserBrightness = Settings.System.getInt(getContentResolver(), 
            Settings.System.SCREEN_BRIGHTNESS,-1); 

То, что актуальная яркость актуальна в данный момент, как установлено автоматическим режимом или приложением, устанавливающим его собственную яркость, является другим вопросом, и я также был бы заинтересован в ответе.