Изменение яркости экрана программно (как с виджетом питания) - PullRequest
29 голосов
/ 04 октября 2011

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

Я хочу иметь возможность изменять яркость точно так же, как когда я нажимаю на кнопку яркости из моего виджета питания. В виджете питания от андроида есть 3 состояния. Один очень яркий, очень темный и один между ними. Можно ли изменить яркость, как когда кто-то нажимает на этот виджет?

enter image description here

Edit1: Я создал это и добавил разрешение в свой манифест, но при запуске приложения я не вижу никаких изменений в яркости, я попытался с 10 с 100, а теперь с 200, но без изменений какие-либо предложения?

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
android.provider.Settings.System.putInt(this.getContentResolver(),
        android.provider.Settings.System.SCREEN_BRIGHTNESS, 200);
}

Ответы [ 5 ]

40 голосов
/ 05 октября 2011

Это полный код, который мне показался работающим:

Settings.System.putInt(this.getContentResolver(),
        Settings.System.SCREEN_BRIGHTNESS, 20);

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness =0.2f;// 100 / 100.0f;
getWindow().setAttributes(lp);

startActivity(new Intent(this,RefreshScreen.class));

Код из моего вопроса не работает, потому что экран не обновляется. Таким образом, один хак при обновлении экрана запускает фиктивную активность, а затем при создании этой фиктивной активности вызывает finish(), чтобы изменения яркости вступили в силу.

13 голосов
/ 04 октября 2011

Используйте решение Tor-Morten в этой ссылке, но также установите настройку яркости системы следующим образом:

android.provider.Settings.System.putInt(getContext().getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS, bright);

Где bright - целое число в диапазоне от 1 до 255.

10 голосов
/ 15 марта 2016

Я решил эту проблему сегодня.

Сначала вы должны добавить разрешение в свой файл AndroidManifest.xml:

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

Где точное место, чтобы поместить это в файл?

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

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

Теперь вы можете включать и выключать автоматический режим яркости.

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);  //this will set the automatic mode on
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);  //this will set the manual mode (set the automatic mode off)

Автоматический режим включен или выключен прямо сейчас? Вы можете получить информацию

int mode = -1;
try {
    mode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); //this will return integer (0 or 1)
} catch (Exception e) {}

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

примечание: SCREEN_BRIGHTNESS_MODE_AUTOMATIC равно 1

примечание: SCREEN_BRIGHTNESS_MODE_MANUAL равно 0

Вы должны использовать это

if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
    //Automatic mode
} else {
    //Manual mode
}

вместо этого

if (mode == 1) {
    //Automatic mode
} else {
    //Manual mode
}

Теперь вы можете изменить яркость вручную

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness);  //brightness is an integer variable (0-255), but dont use 0

и яркость чтения

try {
    int brightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);  //returns integer value 0-255
} catch (Exception e) {}

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

    try {
        int br = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);  //this will get the information you have just set...

        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = (float) br / 255; //...and put it here
        getWindow().setAttributes(lp);
    } catch (Exception e) {}

Не забудьте разрешение ...

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
7 голосов
/ 21 мая 2014

Передача контекста действия при настройке параметров также сделает работу без необходимости запуска другого действия. Следующее сработало для меня -

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.screenBrightness =0.00001f;// i needed to dim the display
this.getWindow().setAttributes(lp);

у меня был этот кусок кода внутри onSensorChanged () метода, который затемнял дисплей при каждом его срабатывании.

3 голосов
/ 15 марта 2016

КОМПЛЕКСНЫЙ ПРИМЕР:

    try {
        //sets manual mode and brightnes 255
        Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);  //this will set the manual mode (set the automatic mode off)
        Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 255);  //this will set the brightness to maximum (255)

        //refreshes the screen
        int br = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = (float) br / 255;
        getWindow().setAttributes(lp);

    } catch (Exception e) {}
...