Android 12 设置默认的屏幕亮度百分比

1、安卓每个版本的更新, 其核心代码也会随之更新,本次为Android 12 版本默认屏幕亮度的修改。

其中涉及的核心代码主要有:

java 复制代码
packages\apps\Settings\src\com\android\settings\display\BrightnessLevelPreferenceController.java
frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java
frameworks/base/res/res/values/config.xml

2、设置默认亮度的主要方法代码

在BrightnessLevelPreferenceController中处理:

java 复制代码
 public class BrightnessLevelPreferenceController extends AbstractPreferenceController implements
            PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop {
     
  
     
        private ContentObserver mBrightnessObserver =
                new ContentObserver(new Handler(Looper.getMainLooper())) {
                    @Override
                    public void onChange(boolean selfChange) {
                        updatedSummary(mPreference);
                    }
                };
     
        public BrightnessLevelPreferenceController(Context context, Lifecycle lifecycle) {
            super(context);
            if (lifecycle != null) {
                lifecycle.addObserver(this);
            }
            PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            mMinBrightness = powerManager.getBrightnessConstraint(
                    PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);
            mMaxBrightness = powerManager.getBrightnessConstraint(
                    PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM);
            mMinVrBrightness = powerManager.getBrightnessConstraint(
                    PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR);
            mMaxVrBrightness = powerManager.getBrightnessConstraint(
                    PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR);
            mContentResolver = mContext.getContentResolver();
            mDefaultBacklight = powerManager.getBrightnessConstraint(
                    PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT);
        }

在PowerManager得到相应的值:

java 复制代码
  private void updatedSummary(Preference preference) {
            if (preference != null) {
                preference.setSummary(NumberFormat.getPercentInstance().format(getCurrentBrightness()));
            }
        }
     
        private double getCurrentBrightness() {
            final int value;
            if (isInVrMode()) {
                value = convertLinearToGammaFloat(System.getFloat(mContentResolver,
                        System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT, mMaxBrightness),
                        mMinVrBrightness, mMaxVrBrightness);
            } else {
                value = convertLinearToGammaFloat(Settings.System.getFloat(mContentResolver,
                        System.SCREEN_BRIGHTNESS_FLOAT, mDefaultBacklight),
                        mMinBrightness, mMaxBrightness);
            }
            return getPercentage(value, GAMMA_SPACE_MIN, GAMMA_SPACE_MAX);
        }
     
        private double getPercentage(double value, int min, int max) {
            if (value > max) {
                return 1.0;
            }
            if (value < min) {
                return 0.0;
            }
            return (value - min) / (max - min);
        }

...

java 复制代码
public final class PowerManagerService extends SystemService
            implements Watchdog.Monitor {
     
    @VisibleForTesting
        PowerManagerService(Context context, Injector injector) {
            super(context);
     
            mContext = context;
    ......
            // Save brightness values:
            // Get float values from config.
            // Store float if valid
            // Otherwise, get int values and convert to float and then store.
            final float min = mContext.getResources().getFloat(com.android.internal.R.dimen
                    .config_screenBrightnessSettingMinimumFloat);
            final float max = mContext.getResources().getFloat(com.android.internal.R.dimen
                    .config_screenBrightnessSettingMaximumFloat);
            final float def = mContext.getResources().getFloat(com.android.internal.R.dimen
                    .config_screenBrightnessSettingDefaultFloat);
            final float doze = mContext.getResources().getFloat(com.android.internal.R.dimen
                    .config_screenBrightnessDozeFloat);
            final float dim = mContext.getResources().getFloat(com.android.internal.R.dimen
                    .config_screenBrightnessDimFloat);
     
            if (min == INVALID_BRIGHTNESS_IN_CONFIG || max == INVALID_BRIGHTNESS_IN_CONFIG
                    || def == INVALID_BRIGHTNESS_IN_CONFIG) {
                mScreenBrightnessMinimum = BrightnessSynchronizer.brightnessIntToFloat(
                        mContext.getResources().getInteger(com.android.internal.R.integer
                                .config_screenBrightnessSettingMinimum),
                        PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
                        PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
                mScreenBrightnessMaximum = BrightnessSynchronizer.brightnessIntToFloat(
                        mContext.getResources().getInteger(com.android.internal.R.integer
                                .config_screenBrightnessSettingMaximum),
                        PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
                        PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
                mScreenBrightnessDefault = BrightnessSynchronizer.brightnessIntToFloat(
                        mContext.getResources().getInteger(com.android.internal.R.integer
                                .config_screenBrightnessSettingDefault),
                        PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
                        PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
            } else {
                mScreenBrightnessMinimum = min;
                mScreenBrightnessMaximum = max;
                mScreenBrightnessDefault = def;
            }
    ..
    }

其中它是通过config中实现的:

java 复制代码
 public float getBrightnessConstraint(int constraint) {
            switch (constraint) {
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM:
                    return mScreenBrightnessMinimum;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM:
                    return mScreenBrightnessMaximum;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT:
                    return mScreenBrightnessDefault;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM:
                    return mScreenBrightnessDim;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE:
                    return mScreenBrightnessDoze;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR:
                    return mScreenBrightnessMinimumVr;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR:
                    return mScreenBrightnessMaximumVr;
                case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR:
                    return mScreenBrightnessDefaultVr;
                default:
                    return PowerManager.BRIGHTNESS_INVALID_FLOAT;
            }
        }

3、修改代码的位置:

   --- a/frameworks/base/res/res/values/config.xml
    +++ b//frameworks/base/res/res/values/config.xml
    @@ -28,5 +28,5 @@
         <item name="config_screenBrightnessSettingMaximumFloat" format="float" type="dimen">1.0</item>
         <!-- Default screen brightness setting set.
         Set this to 0.4 for Default brightness Float.-->
    -    <item name="config_screenBrightnessSettingDefaultFloat" format="float" type="dimen">0.3</item>
    +    <item name="config_screenBrightnessSettingDefaultFloat" format="float" type="dimen">0.4</item>
     </resources>
相关推荐
paopaokaka_luck7 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭20 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师20 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker26 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
诸神黄昏EX1 小时前
Android 分区相关介绍
android
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
ExiFengs1 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj1234567891 小时前
JDK1.8新增特性
java·开发语言
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse