日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android backlight

發布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android backlight 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背光設置是在:設置->聲音和顯示->亮度,通過進度條來設置的。

文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.java

private 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.java

3.1.2 設置亮度

文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.java

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);

??????? }

??? }

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.java

frameworks/base/core/java/android/os/PowerManager.java

3.2 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.java

public 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 是硬件服務,通過該服務調用底層與設備打交道的C/C++代碼,setLightBrightness_UNCHECKED原型如下:

文件:frameworks/base/services/java/com/android/server/HardwareService.java

void 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);

??? }

參數說明:int light 表示類型,選項如下:

static final int LIGHT_ID_BACKLIGHT = 0;

??? static final int LIGHT_ID_KEYBOARD = 1;

??? static final int LIGHT_ID_BUTTONS = 2;

??? static final int LIGHT_ID_BATTERY = 3;

??? static final int LIGHT_ID_NOTIFICATIONS = 4;

static final int LIGHT_ID_ATTENTION = 5;

int brightness 表示亮度值

int brightnessMode 表示亮度的控制模式,選項如下:

/**

???? * Light brightness is managed by a user setting.

???? */

??? static final int BRIGHTNESS_MODE_USER = 0;

?

??? /**

???? * Light brightness is managed by a light sensor.

???? */

static final int BRIGHTNESS_MODE_SENSOR = 1;

由代碼:

int b = brightness & 0x000000ff;

??????? b = 0xff000000 | (b << 16) | (b << 8) | b;

可知,亮度值在此進行了修改,即亮度值的格式變成:FFRRGGBB,FF是沒有的,RR、GG、BB分別是256色的紅綠藍,并且紅綠藍的值都是一樣的亮度值。

3.3 硬件調用

3.3.1獲取硬件

文件:frameworks/base/services/jni/com_android_server_HardwareService.cpp

enum {

????LIGHT_INDEX_BACKLIGHT = 0,

????LIGHT_INDEX_KEYBOARD = 1,

????LIGHT_INDEX_BUTTONS = 2,

????LIGHT_INDEX_BATTERY = 3,

????LIGHT_INDEX_NOTIFICATIONS = 4,

????LIGHT_INDEX_ATTENTION = 5,

??? LIGHT_COUNT

};

?

#define LIGHTS_HARDWARE_MODULE_ID "lights"

?

static jint init_native(JNIEnv *env, jobject clazz)

{

??? int err;

??? hw_module_t* module;

??? Devices* devices;

???

??? devices = (Devices*)malloc(sizeof(Devices));

?

????err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);

????if (err == 0) {

????????devices->lights[LIGHT_INDEX_BACKLIGHT]

????????????????= get_device(module, LIGHT_ID_BACKLIGHT);

????????devices->lights[LIGHT_INDEX_KEYBOARD]

????????????????= get_device(module, LIGHT_ID_KEYBOARD);

????????devices->lights[LIGHT_INDEX_BUTTONS]

????????????????= get_device(module, LIGHT_ID_BUTTONS);

????????devices->lights[LIGHT_INDEX_BATTERY]

????????????????= get_device(module, LIGHT_ID_BATTERY);

????????devices->lights[LIGHT_INDEX_NOTIFICATIONS]

????????????????= get_device(module, LIGHT_ID_NOTIFICATIONS);

????????devices->lights[LIGHT_INDEX_ATTENTION]

????????????????= get_device(module, LIGHT_ID_ATTENTION);

????} else {

??????? memset(devices, 0, sizeof(Devices));

??? }

?

??? return (jint)devices;

}

用hw_get_module獲取ID為LIGHTS_HARDWARE_MODULE_ID的硬件模塊,該模塊含有6個不同類型的亮度控制。

hw_get_module 的實現原理,如下:

文件:hardware/libhardware/Hardware.c

#define HAL_LIBRARY_PATH "/system/lib/hw"

static const char *variant_keys[] = {

??? "ro.hardware",? /* This goes first so that it can pick up a different

?????????????????????? file on the emulator. */

??? "ro.product.board",

??? "ro.board.platform",

??? "ro.arch"

};

?

static const int HAL_VARIANT_KEYS_COUNT =

??? (sizeof(variant_keys)/sizeof(variant_keys[0]));

int hw_get_module(const char *id, const struct hw_module_t **module)

{

??? int status;

??? int i;

??? const struct hw_module_t *hmi = NULL;

??? char prop[PATH_MAX];

??? char path[PATH_MAX];

?

??? /*

???? * Here we rely on the fact that calling dlopen multiple times on

???? * the same .so will simply increment a refcount (and not load

???? * a new copy of the library).

???? * We also assume that dlopen() is thread-safe.

???? */

?

??? /* Loop through the configuration variants looking for a module */

??? for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {

??????? if (i < HAL_VARIANT_KEYS_COUNT) {

????????????if (property_get(variant_keys[i], prop, NULL) == 0) {

??????????????? continue;

??????????? }

????????????snprintf(path, sizeof(path), "%s/%s.%s.so",

????????????????????HAL_LIBRARY_PATH, id, prop);

?? ?????} else {

??????????? snprintf(path, sizeof(path), "%s/%s.default.so",

??????????????????? HAL_LIBRARY_PATH, id);

??????? }

??????? if (access(path, R_OK)) {

??????????? continue;

??????? }

??????? /* we found a library matching this id/variant */

??? ????break;

??? }

?

??? status = -ENOENT;

??? if (i < HAL_VARIANT_KEYS_COUNT+1) {

??????? /* load the module, if this fails, we're doomed, and we should not try

???????? * to load a different variant. */

??????? status = load(id, path, module);

??? }

?

??? return status;

}

property_get(variant_keys[i], prop, NULL) 會按如下順序去獲取如下變量所對應的值,然后返回給prop:

"ro.hardware",? /* This goes first so that it can pick up a different

?????????????????????? file on the emulator. */

??? "ro.product.board",

??? "ro.board.platform",

"ro.arch"

它們對應的變量為:

"ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME"

"ro.board.platform=$TARGET_BOARD_PLATFORM"

如vendor/htc/dream-open/BoardConfig.mk里定義的TARGET_BOARD_PLATFORM := msm7k,則prop返回” msm7k ”,所以path = /system/lib/hw/lights. msm7k.so,也就是說要獲取的硬件模塊為lights. msm7k.so。

3.3.2調用硬件

setLight_native對應的jni C/C++代碼是:

文件:frameworks/base/services/jni/com_android_server_HardwareService.cpp

static void setLight_native(JNIEnv *env, jobject clazz, int ptr,

??????? int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)

{

??? Devices* devices = (Devices*)ptr;

??? light_state_t state;

?

??? if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {

??????? return ;

??? }

?

??? memset(&state, 0, sizeof(light_state_t));

??? state.color = colorARGB;

??? state.flashMode = flashMode;

??? state.flashOnMS = onMS;

??? state.flashOffMS = offMS;

??? state.brightnessMode = brightnessMode;

?

????devices->lights[light]->set_light(devices->lights[light], &state);

}

通過light標識找到對應的light設備,然后再設置亮度。

3.3.3 硬件原型

msm7k的lights對應的硬件原型是在:hardware/msm7k/liblights

文件:hardware/msm7k/liblights/Android.mk

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

LOCAL_MODULE := lights.$(TARGET_BOARD_PLATFORM)

?

也就是生成模塊:/system/lib/hw/lights. msm7k.so

?

文件:hardware/msm7k/liblights/lights.c

/** Open a new instance of a lights device using name */

static int open_lights(const struct hw_module_t* module, char const* name,

??????? struct hw_device_t** device)

{

??? int (*set_light)(struct light_device_t* dev,

??????????? struct light_state_t const* state);

?

??? if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {

??????? set_light = set_light_backlight;

??? }

??? else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {

??????? set_light = set_light_keyboard;

??? }

??? else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {

??????? set_light = set_light_buttons;

??? }

??? else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {

??????? set_light = set_light_battery;

??? }

??? else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {

??????? set_light = set_light_notifications;

??? }

??? else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {

??????? set_light = set_light_attention;

??? }

??? else {

??????? return -EINVAL;

??? }

?

??? pthread_once(&g_init, init_globals);

?

??? struct light_device_t *dev = malloc(sizeof(struct light_device_t));

??? memset(dev, 0, sizeof(*dev));

?

??? dev->common.tag = HARDWARE_DEVICE_TAG;

??? dev->common.version = 0;

??? dev->common.module = (struct hw_module_t*)module;

??? dev->common.close = (int (*)(struct hw_device_t*))close_lights;

??? dev->set_light = set_light;

?

??? *device = (struct hw_device_t*)dev;

??? return 0;

}

static struct hw_module_methods_t lights_module_methods = {

??? .open =? open_lights,

};

以上代碼對應的是:

devices->lights[LIGHT_INDEX_BACKLIGHT]

????????????????= get_device(module, LIGHT_ID_BACKLIGHT);

????????devices->lights[LIGHT_INDEX_KEYBOARD]

????????????????= get_device(module, LIGHT_ID_KEYBOARD);

????????devices->lights[LIGHT_INDEX_BUTTONS]

????????????????= get_device(module, LIGHT_ID_BUTTONS);

????????devices->lights[LIGHT_INDEX_BATTERY]

????????????????= get_device(module, LIGHT_ID_BATTERY);

????????devices->lights[LIGHT_INDEX_NOTIFICATIONS]

????????????????= get_device(module, LIGHT_ID_NOTIFICATIONS);

????????devices->lights[LIGHT_INDEX_ATTENTION]

????????????????= get_device(module, LIGHT_ID_ATTENTION);

也就是說,對不同的亮度設置給予了不同的設置函數。

舉例,背光設置,背光對應的代碼如下:

char const*const LCD_FILE

??????? = "/sys/class/leds/lcd-backlight/brightness";

static int

rgb_to_brightness(struct light_state_t const* state)

{

??? int color = state->color & 0x00ffffff;

??? return ((77*((color>>16)&0x00ff))

??????????? + (150*((color>>8)&0x00ff)) + (29*(color&0x00ff))) >> 8;

}

static int

set_light_backlight(struct light_device_t* dev,

??????? struct light_state_t const* state)

{

??? int err = 0;

??? int brightness = rgb_to_brightness(state);

??? pthread_mutex_lock(&g_lock);

??? g_backlight = brightness;

????err = write_int(LCD_FILE, brightness);

??? if (g_haveTrackballLight) {

??????? handle_trackball_light_locked(dev);

??? }

?? ?pthread_mutex_unlock(&g_lock);

??? return err;

}

也就是往文件/sys/class/leds/lcd-backlight/brightness寫入亮度值,然后驅動會根據該文件更改背光的亮度。LCD_FILE的路徑根據實際情況更改,同時需要在init.rc 修改其權限,使其可寫rgb_to_brightness也根據實際更改,比如要直接亮度值控制,那只要獲取r,g,b其中的一個值就行了,如:

static int

rgb_to_brightness(struct light_state_t const* state)

{

??? int color = state->color & 0x000000ff;

??? return color;

}

總結

以上是生活随笔為你收集整理的android backlight的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。