Я постараюсь ответить, потому что я уже искал это некоторое время назад. Мой короткий ответ: Я не нашел способа получить текущий уровень яркости в автоматическом режиме после всесторонних исследований.
Я разобью это на несколько ответов. Я не буду пропускать помещения, чтобы гуглеры могли найти это полезным. Пропустите то, что вам не нужно.
1- Получить значение настройки яркости
Когда screenBrightness
меньше 0, я бы хотел начать с предпочтительной яркости экрана. Как я могу получить это значение?
Для человека, у которого такое количество репутации, я уверен, что вы уже знакомы с поиском. Есть множество ответов об этом здесь, на SO. Просто проверьте правую панель с похожими вопросами ... при этом я не буду подробно описывать.
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
s и все такое. Однако AFAIK , ACTION_
для изменений яркости не существует, например, SCREEN_[ON|OFF]
. Возможно, в системе есть один скрытый, но я никогда не видел его, и если он не доступен для общественности, у вас есть все возможные ловушки, чтобы с этим справиться.
Есть сообщение от Дайан Хэкборн от декабря 2010 года, в котором она говорит, что "нет трансляции для изменений яркости экрана" .
Итак, я не верю, что есть способ подключиться к чему-то подобному. Конечно, вы можете изменить саму настройку:
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 отображает окружающий люкс на яркость экрана. Я совершенно уверен, что это не линейная вещь (отображение Sensor.getMaximumRange()
линейно на интервал с плавающей запятой 0..1). Я видел, что обычно это отображается логарифмически (обеспечить более точную настройку в более низком диапазоне яркости), но я понятия не имею о параметрах. Возможно, есть рекомендуемый способ по умолчанию, которым пользуются все, но я не эксперт.
Если бы вы могли найти , как Android делает это, посмотрев на место в источниках, где это происходит, это было бы здорово. Но в любом случае, я не приходил так долго, чтобы оставить вас с тем же вопросом. Я обнаружил, что Sensor.getMaximumRange()
не соответствует тому, что вы получаете от SensorEvent
values[0]
. Здесь у меня есть датчик Sharp (Nexus S), и хотя максимальный размер отчета составляет 3000, я видел значения до 10 240.
Итак, получение датчика ненадежно (?). Я предполагаю, по поведению, которое я видел при использовании Android, он каким-то образом отображает getMaximumValue () на максимальную яркость, и любое значение выше его просто не имеет значения.
5- Куда идти отсюда
Я бы больше заглянул в источники Android. Где-то, возможно, на более низком уровне, аппаратное управление, вы могли видеть, как они отображаются Тем не менее, мне интересно, если это надежно, учитывая, что сказала Дайан Хэкборн (похоже, они не хотят, чтобы вы это делали). Я предполагаю, что у них была причина не раскрывать это. Возможно, нужно: почему приложение должно знать настройки системы? Он либо должен предоставить свой собственный уровень для всего приложения, либо, в крайних случаях, предоставить свой собственный «метод автоматического изменения яркости» (как в пункте 4 выше) для замены всей системы или менеджера. Возможно, так думали разработчики оригинала.
В любом случае, если кто-нибудь найдет другие подробности, я был бы очень рад узнать.