web-dev-qa-db-fra.com

Modifier la luminosité du système par programme

Je souhaite modifier la luminosité du système par programme. Pour cela, j'utilise ce code:

WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = (255);
window.setAttributes(lp);

parce que j'ai entendu que la valeur maximale est de 255.

mais ça ne fait rien. Veuillez suggérer tout ce qui peut changer la luminosité. Merci

37
Usman Riaz

Vous pouvez utiliser les éléments suivants:

//Variable to store brightness value
private int brightness;
//Content resolver used as a handle to the system's settings
private ContentResolver cResolver;
//Window object, that will store a reference to the current window
private Window window;

Dans votre écriture onCreate:

//Get the content resolver
cResolver = getContentResolver();

//Get the current window
window = getWindow();

    try
            {
               // To handle the auto
                Settings.System.putInt(cResolver,
                Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
 //Get the current system brightness
                brightness = Settings.System.getInt(cResolver, Settings.System.SCREEN_BRIGHTNESS);
            } 
            catch (SettingNotFoundException e) 
            {
                //Throw an error case it couldn't be retrieved
                Log.e("Error", "Cannot access system brightness");
                e.printStackTrace();
            }

Écrivez le code pour surveiller le changement de luminosité.

vous pouvez alors régler la luminosité mise à jour comme suit:

           //Set the system brightness using the brightness variable value
            Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
            //Get the current window attributes
            LayoutParams layoutpars = window.getAttributes();
            //Set the brightness of this window
            layoutpars.screenBrightness = brightness / (float)255;
            //Apply attribute changes to this window
            window.setAttributes(layoutpars);

Autorisation dans le manifeste:

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

Pour l'API> = 23, vous devez demander l'autorisation via l'activité des paramètres, décrite ici: Impossible d'obtenir l'autorisation WRITE_SETTINGS

44
Ritesh Gune

J'ai eu le même problème.

Deux solutions:

ici, luminosité = (int) 0 to 100 range comme j'utilise la barre de progression

1 SOLUTION

float brightness = brightness / (float)255;
WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = brightness;
        getWindow().setAttributes(lp);

2 SOLUTION

Je viens d'utiliser une activité factice pour appeler lorsque ma barre de progression stop cherche.

 Intent intent = new Intent(getBaseContext(), DummyBrightnessActivity.class);
                    Log.d("brightend", String.valueOf(brightness / (float)255));
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //this is important
                    //in the next line 'brightness' should be a float number between 0.0 and 1.0
                    intent.putExtra("brightness value", brightness / (float)255); 
                    getApplication().startActivity(intent);

Nous arrivons maintenant au DummyBrightnessActivity.class

 public class DummyBrightnessActivity extends Activity{

private static final int DELAYED_MESSAGE = 1;

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);            
    handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == DELAYED_MESSAGE) {
                DummyBrightnessActivity.this.finish();
            }
            super.handleMessage(msg);
        }
    };
    Intent brightnessIntent = this.getIntent();
    float brightness = brightnessIntent.getFloatExtra("brightness value", 0);
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.screenBrightness = brightness;
    getWindow().setAttributes(lp);

    Message message = handler.obtainMessage(DELAYED_MESSAGE);
    //this next line is very important, you need to finish your activity with slight delay
    handler.sendMessageDelayed(message,200); 
}

}

n'oubliez pas d'enregistrer DummyBrightnessActivity pour vous manifester.

j'espère que ça aide!!

14
Bhoomika Brahmbhatt

J'ai essayé plusieurs solutions que d'autres ont publiées et aucune d'entre elles ne fonctionnait parfaitement. La réponse de geet est fondamentalement correcte mais contient quelques erreurs syntaxiques. J'ai créé et utilisé la fonction suivante dans mon application et cela a très bien fonctionné. Notez que cela modifie spécifiquement la luminosité du système comme demandé dans la question d'origine.

public void setBrightness(int brightness){

    //constrain the value of brightness
    if(brightness < 0)
        brightness = 0;
    else if(brightness > 255)
        brightness = 255;


    ContentResolver cResolver = this.getApplicationContext().getContentResolver();
    Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);

}
10
user3092247

Lien de référence

  WindowManager.LayoutParams layout = getWindow().getAttributes();
 layout.screenBrightness = 1F;
  getWindow().setAttributes(layout);     
9
Amit Prajapati

cela a fonctionné pour moi jusqu'à KitKat 4.4 mais pas dans Android L

private void stopBrightness() {
    Settings.System.putInt(this.getContentResolver(),
            Settings.System.SCREEN_BRIGHTNESS, 0);
}
4
user3475052

Ceci est le code complet sur la façon de modifier la luminosité du système

    private SeekBar brightbar;

    //Variable to store brightness value
    private int brightness;
    //Content resolver used as a handle to the system's settings
    private ContentResolver Conresolver;
    //Window object, that will store a reference to the current window
    private Window window;

    /** Called when the activity is first created. */
    @Override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Instantiate seekbar object
        brightbar = (SeekBar) findViewById(R.id.ChangeBright);

        //Get the content resolver
        Conresolver = getContentResolver();

        //Get the current window
        window = getWindow();

        brightbar.setMax(255);

        brightbar.setKeyProgressIncrement(1);

        try {
            brightness = System.getInt(Conresolver, System.SCREEN_BRIGHTNESS);
        } catch (SettingNotFoundException e) {
            Log.e("Error", "Cannot access system brightness");
            e.printStackTrace();
        }

        brightbar.setProgress(brightness);

        brightbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            public void onStopTrackingTouch(SeekBar seekBar) {
                System.putInt(Conresolver, System.SCREEN_BRIGHTNESS, brightness);

                LayoutParams layoutpars = window.getAttributes();

                layoutpars.screenBrightness = brightness / (float) 255;

                window.setAttributes(layoutpars);
            }

            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                if (progress <= 20) {

                    brightness = 20;
                } else {

                    brightness = progress;
                }
            }
        });
    }

Ou vous pouvez vérifier cela tutoriel pour le code complet
codage heureux :)

3
dondondon
<uses-permission Android:name="Android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />

Android.provider.Settings.System.putInt(getContentResolver(),
                    Android.provider.Settings.System.SCREEN_BRIGHTNESS,
                    progress);
2
Mian Taimoor Tahir
private SeekBar Brighness = null;

@Override
protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_lcd_screen_setting);
     initUI();
     setBrightness();
}

private void setBrightness() {

    Brighness.setMax(255);
    float curBrightnessValue = 0;

    try {
        curBrightnessValue = Android.provider.Settings.System.getInt(
                getContentResolver(),
                Android.provider.Settings.System.SCREEN_BRIGHTNESS);
    } catch (Settings.SettingNotFoundException e) {
        e.printStackTrace();
    }
    int screen_brightness = (int) curBrightnessValue;
    Brighness.setProgress(screen_brightness);

    Brighness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        int progress = 0;


        @Override
        public void onProgressChanged(SeekBar seekBar, int progresValue,
                                      boolean fromUser) {
            progress = progresValue;
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // Do something here,
            // if you want to do anything at the start of
            // touching the seekbar
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            Android.provider.Settings.System.putInt(getContentResolver(),
                    Android.provider.Settings.System.SCREEN_BRIGHTNESS,
                    progress);
        }
    });
}

initUI(){
   Brighness = (SeekBar) findViewById(R.id.brightnessbar);
}

Ajoutez ceci dans le manifeste

<uses-permission Android:name="Android.permission.WRITE_SETTINGS"
 tools:ignore="ProtectedPermissions"/>
2
arshad shaikh
WindowManager.LayoutParams params = getWindow().getAttributes();
    params.screenBrightness = 10; // range from 0 - 255 as per docs
    getWindow().setAttributes(params);
    getWindow().addFlags(WindowManager.LayoutParams.FLAGS_CHANGED);

Cela a fonctionné pour moi. Pas besoin d'une activité factice. Cela ne fonctionne que pour votre activité actuelle.

1
prago

Vous devez créer la variable:

windowManager.LayoutParams mParams privé;

puis remplacez cette méthode (pour enregistrer vos paramètres précédents):

@Override
public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
    mParams = params;
    super.onWindowAttributesChanged(params);
}

que là où vous souhaitez modifier la luminosité de l'écran (sur l'application), utilisez simplement:

    mParams.screenBrightness = 0.01f; //use a value between 0.01f for low brightness and 1f for high brightness
    getWindow().setAttributes(mParams);

testé sur la version 28 de l'API.

1
Tal Fiskus

S'il vous plaît Essayez ceci, c'est peut vous aider. A bien fonctionné pour moi

Selon mon expérience

 1st method.
                     WindowManager.LayoutParams lp = getWindow().getAttributes();  
                 lp.screenBrightness = 75 / 100.0f;  
                 getWindow().setAttributes(lp);

où la valeur de luminosité très conforme à 1.0f.100f est la luminosité maximale.

Le code mentionné ci-dessus augmentera la luminosité de la fenêtre actuelle. Si nous voulons augmenter la luminosité de l'ensemble de l'appareil Android, ce code ne suffit pas, pour cela, nous devons utiliser

   2nd method.



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

Où 192 est la valeur de luminosité qui va de 1 à 255. Le principal problème de l'utilisation de la 2ème méthode est qu'elle affichera la luminosité sous une forme accrue dans le périphérique Android mais en fait, elle ne pourra pas augmenter la luminosité du périphérique Android C'est parce qu'il a besoin d'un rafraîchissement.

C'est pourquoi je trouve la solution en utilisant les deux codes ensemble.

            if(arg2==1)
                {

         WindowManager.LayoutParams lp = getWindow().getAttributes();  
                 lp.screenBrightness = 75 / 100.0f;  
                 getWindow().setAttributes(lp);  
                 Android.provider.Settings.System.putInt(getContentResolver(),
                         Android.provider.Settings.System.SCREEN_BRIGHTNESS, 192);


                    }

Ça a bien marché pour moi

1
Ann