IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 8.1 Rk3288 自动亮度值调整 -> 正文阅读

[移动开发]Android 8.1 Rk3288 自动亮度值调整

项目场景:

Rk3288 Android 8.1 自动调节亮度打开有异常.


问题描述

机器打开 "自动调节亮度"时, 屏幕亮度会随着 LightSensor 值变化,但是设置和导状态栏中的亮度值Bar均没有变化.

     // Setting 中的值未改变.???
???? private double getCurrentBrightness() {
? ? ? ? if (isInVrMode()) {
? ? ? ? ? ? final double value = System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS_FOR_VR,
? ? ? ? ? ? ? ? ? ? mMaxBrightness);
? ? ? ? ? ? return getPercentage(value, mMinVrBrightness, mMaxVrBrightness);
? ? ? ? }
? ? ? ? final int brightnessMode = Settings.System.getInt(mContentResolver,
? ? ? ? ? ? ? ? System.SCREEN_BRIGHTNESS_MODE, System.SCREEN_BRIGHTNESS_MODE_MANUAL);
? ? ? ? if (brightnessMode == System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
? ? ? ? ? ? final float value = Settings.System.getFloat(mContentResolver,
? ? ? ? ? ? ? ? ? ? System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0);
? ? ? ? ? ? // auto brightness is between -1 and 1
? ? ? ? ? ? return getPercentage(value, -1, 1);
? ? ? ? }
? ? ? ? final double value = Settings.System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS,
? ? ? ? ? ? ? ? mMinBrightness);
? ? ? ? return getPercentage(value, mMinBrightness, mMaxBrightness);
? ? }
      // Settings 亮度Bar 未发生变化
??????private final Runnable mUpdateSliderRunnable = new Runnable() {
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? if (mIsVrModeEnabled) {
? ? ? ? ? ? ? ? int value = Settings.System.getIntForUser(mContext.getContentResolver(),
? ? ? ? ? ? ? ? ? ? ? ? Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mMaximumBacklight,
? ? ? ? ? ? ? ? ? ? ? ? UserHandle.USER_CURRENT);
? ? ? ? ? ? ? ? mHandler.obtainMessage(MSG_UPDATE_SLIDER,
? ? ? ? ? ? ? ? ? ? ? ? mMaximumBacklightForVr - mMinimumBacklightForVr,
? ? ? ? ? ? ? ? ? ? ? ? value - mMinimumBacklightForVr).sendToTarget();
? ? ? ? ? ? } else if (mAutomatic) {
? ? ? ? ? ? ? ? float value = Settings.System.getFloatForUser(mContext.getContentResolver(),
? ? ? ? ? ? ? ? ? ? ? ? Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0,
? ? ? ? ? ? ? ? ? ? ? ? UserHandle.USER_CURRENT);
? ? ? ? ? ? ? ? mHandler.obtainMessage(MSG_UPDATE_SLIDER, (int) BRIGHTNESS_ADJ_RESOLUTION,
? ? ? ? ? ? ? ? ? ? ? ? (int) ((value + 1) * BRIGHTNESS_ADJ_RESOLUTION / 2f)).sendToTarget();
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? int value;
? ? ? ? ? ? ? ? value = Settings.System.getIntForUser(mContext.getContentResolver(),
? ? ? ? ? ? ? ? ? ? ? ? Settings.System.SCREEN_BRIGHTNESS, mMaximumBacklight,
? ? ? ? ? ? ? ? ? ? ? ? UserHandle.USER_CURRENT);
? ? ? ? ? ? ? ? mHandler.obtainMessage(MSG_UPDATE_SLIDER, mMaximumBacklight - mMinimumBacklight,
? ? ? ? ? ? ? ? ? ? ? ? value - mMinimumBacklight).sendToTarget();
? ? ? ? ? ? }
? ? ? ? }
? ? };??

?Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ??值未发生变化.


原因分析:

自动亮度开启后 , 当屏幕亮度发生改变时,"/sys/class/backlight/backlight/brightness" 值会改变.

当亮度值改变时 会出现以下的LOG,

E/Lights Hal(  240): write_int failed to open /sys/class/backlight/rk28_bl/brightness

继而找到? \hardware\rockchip\liblights\lights.cpp .? 调用set_backlight_light()

#define BACKLIGHT_PATH1 "/sys/class/backlight/backlight/brightness" // for kernel 4.4
int set_backlight_light(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);
    err = write_int(BACKLIGHT_PATH, brightness);
    if (err !=0)
        err = write_int(BACKLIGHT_PATH1, brightness);
    pthread_mutex_unlock(&g_lock);
    return 0;
}

frameworks\base\services\core\java\com\android\server\lights\LightsService.java 和?frameworks\base\services\core\java\com\android\server\lights\Light.java? ? ?setBrightness()

        @Override
        public void setBrightness(int brightness) {
            setBrightness(brightness, BRIGHTNESS_MODE_USER);
        }

        @Override
        public void setBrightness(int brightness, int brightnessMode) {
            synchronized (this) {
                // LOW_PERSISTENCE cannot be manually set
                if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
                    Slog.w(TAG, "setBrightness with LOW_PERSISTENCE unexpected #" + mId +
                            ": brightness=0x" + Integer.toHexString(brightness));
                    return;
                }

                int color = brightness & 0x000000ff;
                color = 0xff000000 | (color << 16) | (color << 8) | color;
                setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
            }
        }

setBrightness() 这个方法只有在? ?frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java 中调用.

    public Runnable requestDisplayStateLocked(final int state, final int brightness) {
        /* 省略代码 */
                    private void setDisplayBrightness(int brightness) {
                        if (DEBUG) {
                            Slog.d(TAG, "setDisplayBrightness("
                                    + "id=" + displayId + ", brightness=" + brightness + ")");
                        }

                        Trace.traceBegin(Trace.TRACE_TAG_POWER, "setDisplayBrightness("
                                + "id=" + displayId + ", brightness=" + brightness + ")");
                        try {
                            mBacklight.setBrightness(brightness);
                            Trace.traceCounter(Trace.TRACE_TAG_POWER,
                                    "ScreenBrightness", brightness);
                        } finally {
                            Trace.traceEnd(Trace.TRACE_TAG_POWER);
                        }
                    }
    }

再往上追代码 设置 "/sys/class/backlight/backlight/brightness"?节点是在?frameworks\base\services\core\java\com\android\server\displayDisplayManagerService.java 中?requestGlobalDisplayStateInternal(int state, int brightness) 方法里. 这个类是由 DisplayPowerState.java 调用的.

import android.os.IPowerManager;
import android.os.ServiceManager;
import android.os.AsyncTask;

        // in requestGlobalDisplayStateInternal(int state, int brightness)  
        // Add for LightSensor_ADJ by brightness Change in  begin
        final float adj = brightness / (BRIGHTNESS_ADJ_RESOLUTION / 2f) - 1;
        setBrightnessAdj(adj);
        Slog.wtf(TAG, "-----requestGlobalDisplayStateInternal : ----adj " +adj);
        AsyncTask.execute(new Runnable() {
            public void run() {
                Settings.System.putFloat(mContext.getContentResolver(),
                        Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj);
            }
        });
        // Add for LightSensor_ADJ by brightness Change end



    private void setBrightnessAdj(float adj) {
        try {
            mPower.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(adj);
        } catch (RemoteException ex) {
        }
    }

在此设置后,即可在 LightSensor 改变 brightness 时,同步改变?Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ 的值,继而实现动态改变Settings的值.


解决方案:

当屏幕亮度("/sys/class/backlight/backlight/brightness")变化时,Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ??值应随之变化.

采用倒追法,完成的本项功能,逻辑尚不算是很清晰,若有大神,可以针对Android 9 以下指点不胜感激.

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:19:35  更:2022-04-06 23:21:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 21:54:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码