前言,本文通過修改framework代碼實現,單純在app上是無法做到的,此外本文修改的是安卓9.0源碼。
1、安卓app中通過代碼修改屏幕亮度的方法。
/**
* 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 if power save is close @{
final int screenBrightnessSettingMinimum = 0;
// @}
這樣就能使Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, 0);生效,且不影響系統設置中的亮度設置最小值。
3、通過app設置屏幕亮度爲0後,若直接重啓系統,則開機後屏幕亮度也是0,及屏幕全黑,導致無法操作,解決方法。
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);
setSysScreenBrightness(lastBrighness, mContext);
}
// @}
// .....
}