Welcome 微信登录

首页 / 操作系统 / Linux / Android LCD和键盘 背光亮度设置

亮度设置
 应用设计
1.1 设置进度条范围
背光设置是在:设置->声音和显示->亮度,通过进度条来设置的。文件:packages/apps/Settings/src/com/Android/settings/BrightnessPreference.javaprivate static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;mSeekBar.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT);设置进度条的范围,BRIGHTNESS_DIM = 20  BRIGHTNESS_ON=255,它们的定义在:frameworks/base/core/java/android/os/Power.java1.2 设置亮度
文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.javapublic 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);        }    }private void setBrightness(int brightness) {        try {            IPowerManager power = IPowerManager.Stub.asInterface(                    ServiceManager.getService("power"));            if (power != null) {                power.setBacklightBrightness(brightness);            }        } catch (RemoteException doe) {                    }        }由以上代码可知,brightness的范围是:20~255;代码通过服务管理器(ServiceManager)获得power服务,然后通过power服务设置亮度。power.setBacklightBrightness的定义在:rameworks/base/core/java/android/os/IPowerManager.aidl.javaframeworks/base/core/java/android/os/PowerManager.java2, Power服务
文件:frameworks/base/core/java/android/os/Power.java/**     * Brightness value for dim backlight     */    public static final int BRIGHTNESS_DIM = 20;    /**     * Brightness value for fully on     */public static final int BRIGHTNESS_ON = 255;文件:frameworks/base/core/java/android/os/PowerManager.java/**     * sets the brightness of the backlights (screen, keyboard, button).     *     * @param brightness value from 0 to 255     *     * {@hide}     */    public void setBacklightBrightness(int brightness)    {        try {            mService.setBacklightBrightness(brightness);        } catch (RemoteException e) {        }}电源管理器(powermager)将brightness转给电源服务,该服务位置如下:文件:frameworks/base/services/java/com/android/server/PowerManagerService.javapublic void setBacklightBrightness(int brightness) {        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);        // Don"t let applications turn the screen all the way off        brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness,                HardwareService.BRIGHTNESS_MODE_USER);        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,            (mKeyboardVisible ? brightness : 0), HardwareService.BRIGHTNESS_MODE_USER);        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness,            HardwareService.BRIGHTNESS_MODE_USER);        long identity = Binder.clearCallingIdentity();        try {            mBatteryStats.noteScreenBrightness(brightness);        } catch (RemoteException e) {            Log.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e);        } finally {            Binder.restoreCallingIdentity(identity);        }        // update our animation state        if (ANIMATE_SCREEN_LIGHTS) {            mScreenBrightness.curValue = brightness;            mScreenBrightness.animating = false;            mScreenBrightness.targetValue = -1;        }        if (ANIMATE_KEYBOARD_LIGHTS) {            mKeyboardBrightness.curValue = brightness;            mKeyboardBrightness.animating = false;            mKeyboardBrightness.targetValue = -1;        }        if (ANIMATE_BUTTON_LIGHTS) {            mButtonBrightness.curValue = brightness;            mButtonBrightness.animating = false;            mButtonBrightness.targetValue = -1;        }    }由以上代码可知,同时设置了背光、键盘、按钮的亮度。mHardware 是硬件服务,通过该服务调用底层与设备打交道的CC++代码,setLightBrightness_UNCHECKED原型如下:文件:frameworks/base/servicesjavacomandroidserverHardwareService.javavoid setLightBrightness_UNCHECKED(int light, int brightness, int brightnessMode) {        int b = brightness & 0x000000ff;        b = 0xff000000 | (b << 16) | (b << 8) | b;        setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode);    }