如果要控制屏幕亮度,则必须将其设置为手动模式,因为当您在活动中更改亮度并且系统设置为自动时,许多设备会出现各种问题。所以你的方法应该如下:
- 从系统设置中读取并存储当前亮度级别。
- 在您的应用程序中做任何您想做的事情。
- 将保存的级别恢复到系统设置中。
作为开发人员,您应该尊重用户对亮度的原始设置。因此,只要您尊重用户,您操纵自动亮度设置的想法实际上是最佳实践。
这里有两个有用的函数,第一个读取当前级别 (0-255),如果亮度处于自动模式,则返回 -1,如果由于某种原因无法读取设置,则返回 -2。第二个将亮度级别设置为您想要的级别,如果您将 -1 作为 brLevel 传递,它将亮度设置为自动。
public static int getBrightnessLevel(Context cx) {
int result = -1;
if (cr == null) cr = cx.getContentResolver();
if (cr != null) {
boolean isAuto = false;
try {
isAuto = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
} catch (Exception ex) {
isAuto = false;
}
if (isAuto) {
result = -1;
} else {
try {
result = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS);
} catch (Exception ex) {
result = -2;
}
}
} else {
result = -2;
}
return result;
}
public static void setBrightnessLeve(Context cx, int brLevel) {
if (cr == null) cr = cx.getContentResolver();
if (cr != null) {
try {
if (brLevel >= 0) {
Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brLevel);
} else {
Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
}
} catch (Exception ex) {
//Do Nothing...
}
}
}
我开发了一个亮度小部件,它控制整个系统的屏幕亮度,并且仅适用于一个应用程序,这是我正在使用的方法:
用户通过滑动控制选择他想要的级别(10 - 100)。这里要小心,不要让用户选择小于 10% 的东西,否则屏幕会变暗,他将无法恢复亮度,因为他什么都看不到。
我正在更改系统设置中的亮度设置以反映用户选择。
我正在启动一个非 ui 活动,目的是增加用户选择的亮度以设置屏幕亮度,因为设置更改不会立即生效。
为了完整起见,这里是活动代码:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;
public class act_brightnesshelper extends Activity {
//----- Private Static Members -----
private static final String TAG = "act_brightnesshelper";
//----- Private Static Members END -----
//----- Private Members -----
private int brightnessLevel;
//----- Private Members END -----
//----- Activity Overrides -----
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
brightnessLevel = this.getIntent().getExtras().getInt("brightnessLevel");
}
@Override
public void onAttachedToWindow() {
Log.d(TAG, "onAttachedToWindow brightnessLevel = " + brightnessLevel);
super.onAttachedToWindow();
WindowManager.LayoutParams lp = getWindow().getAttributes();
try {
lp.screenBrightness = brightnessLevel / 255f;
getWindow().setAttributes(lp);
} catch(Exception ex) {
//Do Nothing...
}
//Finish the Activity after 500ms...
Thread WaitThread = new Thread(){
@Override
public void run() {
try {Thread.sleep(500);} catch (InterruptedException e) {}
finish();
}
};
WaitThread.start();
}
//----- Activity Overrides END-----
}
当然,您的应用程序具有不同的功能,但如果您选择这种方式,您可以从我的代码中获得您需要的内容。最后,正如您所说,您将需要
android.permission.WRITE_SETTINGS
允许。
希望这可以帮助...