屏幕亮度自动调度:主如若从Sensor分析之均分离出来分析LIGHT 后光感应器,因此就分析一下自动调度屏幕亮度(手机跟着后光的强度自我调度,也即是在亮的后光下屏幕自动调亮一些,暗的时期就自动调暗一些,省得后光对眼睛有刺激).....
(本东谈主从历经闭塞才八成了解过程),咫尺就脱手讲一下过程,如果有折柳所在但愿牛东谈主指出来。。。
先从Sttings脱手吧,在diaplay中有屏幕亮度调度,有一个进程调,上头有一个checkbox(自动调度屏幕亮度的),那么咱们虽然去找settings下的文献脱手看了,先找到DiaplaySettings.java文献以及display_setting.xml文献,display_setting.xml内部能找到相应的组件,然而 在DiaplaySettings.java文献中却不成找到调用相应组件的代码,
那么咱们再到settings中去找,能找到BrightnessPreference.java文献,没错这个文献即是自动调度亮度的文献,咱们先望望代码:构造函数中有mAutomaticAvailable = context.getResources().getBoolean(com.android.internal.R.bool.config_automatic_brightness_available);脱手合计mAutomaticAvailabl的值(为true,在config.xml中)是判断是否自动调度亮度,因为在我跟进到PowerManagerService.java中,在initInThread() 中 mUseSoftwareAutoBrightness = resources.getBoolean( com.android.internal.R.bool.config_automatic_brightness_available); if (mUseSoftwareAutoBrightness) { mAutoBrightnessLevels = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLevels);//得到自动化调度的值调用 getAutoBrightnessValue(int sensorValue, int[] values) 时期 mLcdBacklightValues = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); mButtonBacklightValues = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessButtonBacklightValues); mKeyboardBacklightValues = resources.getIntArray(。。。。。。。。。。。这里看起来好像是当mUseSoftwareAutoBrightness为true时就取得config.xml文献config_autoBrightnessLevels的值,再去把柄后光自动调度,然而mAutomaticAvailabl的值仅仅阐发有莫得自动调度屏幕的功能(比如说你将config.xml文献的config_automatic_brightness_available的值改为false,编译替换framework-res.apk那么在屏幕亮度调度中将莫得自动调度的checkbox),这也能阐扬构造函数一脱手就运行化mAutomaticAvailabl的值。
接下来在BrightnessPreference.java文献中有onProgressChanged,onStartTrackingTouch(SeekBar seekBar),onStopTrackingTouch(SeekBar seekBar)时期,这些一看也能懂就不先容了,在onBindDialogView(View view)时期中有mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode); if (mAutomaticAvailable) {//当有自动调度功能 mCheckBox.setOnCheckedChangeListener(this);//为checkbox添加监听事件 try { mOldAutomatic = Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);。。。。。。主要看public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); if (!isChecked) { setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT); } }这里才是你汲取自动调度亮度的checkbox,如果汲取则setMode(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);并将数据存放到数据库中。
这里是重心:这里有个数据库,当监测到数据库中的值发生更正时也即是变为Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC时,就会跳到powerManagerService.java的initInThread()中ContentResolver resolver = mContext.getContentResolver(); Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null, "(" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?) or (" + Settings.System.NAME + "=?)", new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN, XEC_DLS_CONTROL, SCREEN_BRIGHTNESS_MODE, WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE}, null); mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler); SettingsObserver settingsObserver = new SettingsObserver(); mSettings.addObserver(settingsObserver);数据库中数据发生更正时触发事件的发生。
在 powerManagerService.java的systemReady()(只在开机调用一次就不再调用)中 if (mUseSoftwareAutoBrightness) { Log.i("frist","frist="+"aaaa"); mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); enableLightSensor(true); }而mUseSoftwareAutoBrightness是在initInThread()线程中取得了true值,那么就到enableLightSensor(true);时期去看 if (enable) { mSensorManager.registerListener(mLightListener, mLightSensor, SensorManager.SENSOR_DELAY_NORMAL); }如果传递来的值为true也即是enable=true就监听况且用匹配屏幕标的变化的感应SENSOR_DELAY_NORMAL。再看mLightListener事件:SensorEventListener mLightListener = new SensorEventListener() { public void onSensorChanged(SensorEvent event) { synchronized (mLocks) { int value = (int)event.values[0];//从event内部赢恰现时数据 Log.i("value","value="+value); long milliseconds = SystemClock.elapsedRealtime(); if (mDebugLightSensor) { Slog.d(TAG, "onSensorChanged: light value: " + value); } mHandler.removeCallbacks(mAutoBrightnessTask); if (mLightSensorValue != value) {//mLightSensorValue是现时的屏幕亮度 if (mLightSensorValue == -1