前言,本文通过修改framework代码实现,单纯在app上是无法做到的,此外本文修改的是安卓9.0源码。
1、安卓app中通过代码修改屏幕亮度的方法。
可能需要的权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
设置屏幕亮度:
/**
* app中设置亮度函数
* 设置当前系统的亮度值:0~255
* 虽然参数可以为0,但是实际上屏幕还是有一定亮度,实际会设置为10,这个值对应的具体配置文件位置:
* frameworks\base\core\res\res\values\config.xml中config_screenBrightnessSettingMinimum值
* 虽然把这个值设为0可以将亮度设为0,但是系统设置中的亮度调节也可以调到0,这不是我们想要的结果。
* 我们只是单纯的想通过代码设置亮度为0
*/
public void setSysScreenBrightness(int brightness, Context context) {
try {
ContentResolver resolver = context.getContentResolver();
Uri uri = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
resolver.notifyChange(uri, null); // 实时通知改变
} catch (Exception e) {
Log.e("xxx", "设置当前系统的亮度值失败:" + e.getMessage(), e);
}
}
2、实现只能通过代码修改屏幕亮度为0,而不影响系统设置中屏幕亮度的最小值方法。
为了不影响系统亮度设置,我们不去修改frameworks\base\core\res\res\values\config.xml中config_screenBrightnessSettingMinimum参数值。而是修改frameworks\base\services\core\java\com\android\server\display\DisplayPowerController.java的构造函数。
DisplayPowerController(),如下修改,可设置最小亮度为0
将如下语句
final int screenBrightnessSettingMinimum = clampAbsoluteBrightness(resources.getInteger(
com.android.internal.R.integer.config_screenBrightnessSettingMinimum));
改成
// add by zzh for set birghtness as 0 @{
final int screenBrightnessSettingMinimum = 0;
// @}
这样就能使Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, 0);生效,且不影响系统设置中的亮度设置最小值。
3、通过app设置屏幕亮度为0后,若直接重启系统,则开机后屏幕亮度也是0,即屏幕全黑,导致无法操作,解决方法。
\frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java中
private void updatePowerStateLocked() {
// add by zzh @{
// system param, if true, then use default screen timeout way, or only set brightness as 0
boolean needSleep = SystemProperties.getBoolean("persist.sys.powersave.open", true);
if (!needSleep && mDirty == 288) {
// mDirty == 288 only boot system can fit
// if has set brightness as 0 before reboot,
// we will reset brightness to non zero bright, or screen is black after boot
int lastBrighness = SystemProperties.getInt("persist.sys.last.brightness", 10);
// reset to default brightness
if (lastBrighness <= 0)
lastBrighness = 102;
setSysScreenBrightness(lastBrighness, mContext);
}
// @}
// .....
}