Невозможно применять системную яркость экрана программно в Android
Я использую следующее, чтобы установить режим автоматической яркости системы и уровень:
android.provider.Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
android.provider.Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, y.brightness1);
Я могу включать и выключать автоматические бригады и устанавливать разные уровни. Настройки, кажется, применяются правильно - я могу перейти в Настройки → Дисплей → Яркость, и всякая настройка, которую я установил, действительно отображается правильно. Однако фактический экран не меняет свою яркость. Если я просто коснусь ползунка в настройках экрана, тогда все будет применено.
Я хочу упомянуть, что я запускаю приложение с основным видом деятельности, и эти настройки применяются в BroadcastReceiver. Я попытался создать фиктивную активность и протестировал там материал, но получил те же результаты.
Ответы
Ответ 1
ОК, нашел ответ здесь:
Обновление дисплея от виджета?
В принципе, нужно сделать прозрачную активность, которая обрабатывает изменение яркости. То, что не упоминается в сообщении, заключается в том, что вы должны делать:
Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, brightnessLevel);
то do
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = brightness;
getWindow().setAttributes(lp);
И если вы назовете закончить() сразу после внесения изменений, яркость никогда не изменится, потому что макет должен быть создан до того, как будут применены настройки яркости. Таким образом, я закончил создание потока с задержкой в 300 мс, а затем вызвал finish().
Ответ 2
Я делаю что-то подобное с яркостью экрана в одном из моих приложений, и я делаю это через WindowManager, и он работает. Я использую следующий код, чтобы получить текущую яркость экрана (и сохранить его позже) и установить его полностью:
WindowManager.LayoutParams lp = getWindow().getAttributes();
previousScreenBrightness = lp.screenBrightness;
float brightness = 1;
lp.screenBrightness = brightness;
getWindow().setAttributes(lp);
Ответ 3
Я создал статический метод в своем классе приложения, который я вызываю из всех моих методов Activity.onResume().
MyApplication extends Application {
...
public static void setBrightness(final Activity context) {
// get the content resolver
final ContentResolver cResolver = context.getContentResolver();
// get the current window
final Window window = context.getWindow();
try {
// get the current system brightness
int brightnessLevel = System.getInt(cResolver,System.SCREEN_BRIGHTNESS);
// get the current window attributes
LayoutParams layoutpars = window.getAttributes();
// set the brightness of this window
layoutpars.screenBrightness = brightnessLevel / (float) 255;
// apply attribute changes to this window
window.setAttributes(layoutpars);
} catch (SettingNotFoundException e) {
// throw an error cuz System.SCREEN_BRIGHTNESS couldn't be retrieved
Log.e("Error", "Cannot access system brightness");
e.printStackTrace();
}
}
}
MyActivity extends Activity {
...
public void onResume() {
super.onResume();
Log.d(TAG, "onResume()");
MyApplication.setBrightness(this);
}
}
Ответ 4
Используйте ответ, полученный "user496854" выше
Если вы используете max screenBrightness = 255, то при выполнении
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = brightness; getWindow().setAttributes(lp);
разделите screenBrightness на 255, как
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = brightness/(float)255;
getWindow().setAttributes(lp);