web-dev-qa-db-fra.com

Modification de la luminosité de l'écran par programme (comme avec le widget d'alimentation)

Je cherchais comment changer la luminosité de l'écran par programme et j'ai trouvé ceci c'est une très bonne solution et cela fonctionne bien, mais cela ne fonctionne que lorsque mon application est active. Après l'arrêt de mon application, la luminosité revient à la même valeur qu'avant de démarrer mon application.

Je veux pouvoir changer la luminosité comme lorsque j'appuie sur le bouton de luminosité de mon widget d'alimentation. Dans le widget d'alimentation qui vient de Android il y a 3 états. Un très lumineux, un très sombre et un entre les deux. Est-il possible de changer la luminosité comme quand quelqu'un appuie sur ce widget?

enter image description here

Edit1: J'ai créé cela et j'ai ajouté la permission à mon manifeste, mais lorsque l'application est lancée, je ne vois aucun changement de luminosité, j'ai essayé avec 10 avec 100 et maintenant avec 200 mais aucun changement aucune suggestion?

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);
}
29
Lukap

Voici le code complet que j'ai trouvé fonctionner:

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));

Le code de ma question ne fonctionne pas car l'écran n'est pas actualisé. Donc, un piratage lors de l'actualisation de l'écran démarre une activité factice et ensuite lors de la création de cette activité factice pour appeler finish() afin que les changements de luminosité prennent effet.

40
Lukap

Utilisez la solution de Tor-Morten dans ce lien, mais définissez également le paramètre de luminosité du système comme suit:

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

bright est un entier compris entre 1 et 255.

13
Glitch

J'ai résolu ce problème aujourd'hui.

En tant que premier, vous devez mettre une autorisation dans votre fichier AndroidManifest.xml:

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

Où est l'endroit exact pour le mettre dans le fichier?

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

Cette autorisation indique que vous êtes autorisé à modifier les paramètres qui affectent également d'autres applications.

Vous pouvez maintenant activer et désactiver le mode automatique de luminosité

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)

Le mode automatique est-il activé ou désactivé actuellement? Vous pouvez obtenir les informations

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

Donc, si vous souhaitez modifier la luminosité manuellement, vous devez d'abord définir le mode manuel et ensuite vous pouvez modifier la luminosité.

note: SCREEN_BRIGHTNESS_MODE_AUTOMATIC est 1

note: SCREEN_BRIGHTNESS_MODE_MANUAL vaut 0

Vous devez utiliser ceci

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

au lieu de cela

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

Vous pouvez maintenant modifier la luminosité manuellement

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

et lire la luminosité

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

Maintenant, tout est réglé correctement, mais ... vous ne pouvez pas encore voir le changement. Vous avez besoin d'une chose pour voir le changement! Actualisez l'écran ... alors procédez comme suit:

    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) {}

N'oubliez pas la permission ...

<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
10
PEPAN

Passer le contexte de l'activité lors de la configuration des paramètres permettrait également de faire le travail sans avoir besoin de démarrer une autre activité. Ce qui suit a fonctionné pour moi-

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

j'ai eu ce morceau de code à l'intérieur onSensorChanged () méthode qui atténuait l'affichage chaque fois qu'il était déclenché.

7
Deepak Negi

EXEMPLE COMPLEXE:

    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) {}
3
PEPAN