3 Stimmen

Die Helligkeit programmatisch zu ändern, während der Automatikmodus verwendet wird, hat keine Auswirkung in Android.

Ich habe Code geschrieben, um DialogPreference zu erstellen, der ähnlich wie der Standard-Android-Helligkeitseinstellungsdialog funktionieren soll.

Es funktioniert perfekt, solange der Helligkeitsmodus auf Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL gesetzt ist. Wenn ich jedoch den Modus auf Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC ändere, wird die Bildschirmhelligkeit des Telefons nicht auf den Wert von Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS) übernommen.

Lassen Sie mich Ihnen ein Beispiel zeigen:

  1. Ich setze die Helligkeit in den Android-Einstellungen auf 255 und den Modus auf automatisch. Die Änderungen werden vom Telefon (sowie von meiner App) reflektiert.
  2. Ich setze die Helligkeit in den Android-Einstellungen auf 100 und den Modus auf manuell. Die Änderungen werden vom Telefon (sowie von meiner App) reflektiert.
  3. Ich setze die Helligkeit in meiner App auf 50 und der Modus ist immer noch manuell. Die Änderungen werden vom Telefon (sowie von meiner App) reflektiert.
  4. Ich setze die Helligkeit in meiner App auf 50 und den Modus auf automatisch. Obwohl ich die aktuelle Bildschirmhelligkeit programmgesteuert auf 50 ändere, hat der Rest meiner App und das Telefon selbst (zum Beispiel die Telefoneinstellungen und das Startmenü) eine Helligkeit von 255 und den Modus auf automatisch (was ich in den Android-Einstellungen überprüfen kann). Gleichzeitig gibt Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS) immer noch 50 zurück.

Hier ist mein Code. Wie gesagt, er befindet sich in einer Klasse, die DialogPreference erweitert, daher die Methode onCreateDialogView.

private static int MAX_BRIGHTNESS_VALUE = 255;

@Override
protected View onCreateDialogView() {
    View dialogView = super.onCreateDialogView();
    mAutomatic = (CheckBox) dialogView.findViewById(R.id.automatic_brightness);
    mBrightnessBar = (SeekBar) dialogView.findViewById(R.id.brightness_bar);

    mBrightnessBar.setMax(MAX_BRIGHTNESS_VALUE);
    mAutomatic.setChecked(getBrightnessMode() == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
    mBrightnessBar.setProgress(getBrightness());

    mAutomatic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                setAutomaticBrightness();
            } else {
                setManualBrightness();
            }
        }

    });
    mBrightnessBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (progress > 10) {
                setBrightness(progress);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

    });
    return dialogView;
}

private void setBrightness(int value) {
    Settings.System.putInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, value);

    // hier setze ich die aktuelle Bildschirmhelligkeit programmgesteuert
    Window window = ((Activity) getContext()).getWindow();
    LayoutParams layoutpars = window.getAttributes();
    layoutpars.screenBrightness = value / (float) MAX_BRIGHTNESS_VALUE;
    window.setAttributes(layoutpars);
}

private int getBrightness() {
    try {
        return Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
    } catch (SettingNotFoundException e) {
        e.printStackTrace();
        return MAX_BRIGHTNESS_VALUE;
    }
}

private void setAutomaticBrightness() {
    Settings.System.putInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE,
            Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
}

private void setManualBrightness() {
    Settings.System.putInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE,
            Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}

private int getBrightnessMode() {
    try {
        return Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
    } catch (SettingNotFoundException e) {
        e.printStackTrace();
        return Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
    }
}

In meinem AndroidManifest.xml habe ich

Weiß jemand, was hier passiert? Ich habe einige Threads auf Stack Overflow mit ähnlichen Problemen gesehen, aber keiner von ihnen hat eine hilfreiche Antwort erhalten.

1voto

David Punkte 640

Wenn Sie den Helligkeitsmodus auf automatisch einstellen, müssen Sie die automatische Helligkeitsanpassung stoppen, bevor Sie die Helligkeit einstellen. Dieser Code hat bei mir funktioniert:

      public static void stopAutoBrightness(Activity activity) {
          android.provider.Settings.System.putInt(activity.getContentResolver(),
                  android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE,
                  android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
        }

0voto

Es scheint, dass es einfach so funktioniert. Wenn Sie den Helligkeitsmodus selbst auf automatisch setzen, können Sie den Helligkeitspegel nicht manipulieren.

Ein Beispiel finden Sie hier: BrightnessPreference-Code auf grepcode.com für 4.1.2. In dieser Einstellung wird der Helligkeits-SeekBar deaktiviert, wenn der Helligkeitsmodus automatisch ist.

Basiert auf BrightnessPreference-Code auf grepcode.com für 4.4.2, habe ich die folgende starre Lösung gefunden:

@Override
protected void onClick() {
    Intent intent = new Intent("com.android.settings.BrightnessPreferenceActivity");
    startActivity(intent);
}

Es startet einfach die Aktivität, die in den Android-Einstellungen verwendet wird. Das war in meinem Fall gut genug.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X