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>
相关推荐
程序员清风18 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme18 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
恋猫de小郭18 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Be_Better18 小时前
学会与虚拟机对话---ASM
java
开源之眼21 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori3161 天前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户908324602731 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋1 天前
DecimalFormat 与 BigDecimal
java·后端
beata1 天前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端
IT探险家1 天前
你的第一个 Java 程序就翻车?HelloWorld 的 8 个隐藏陷阱
java