目录:

1,sensor 基本架构图

2,Lsensor UI 手动设定

3,Lsensor 自动算法

关键词:

lux : 环境光线

nit: 屏幕亮度

backlight:UI 中设定进度条显示数字

1-sensor 基本架构图

Light sensor 属于sensor 其中的一个设备, 因此架构都一样,light sensor 有I2C 接口,spi 接口,要从硬件上选择一种就可以, 最好选择I2C , 进行i2c通信就可以获取lux 值

图片.png

Lsensor 数据获取步骤(获取lux 可定制开发app)

Setp0:获取传获取传感器对象

Setp1:感器管理器对象

Setp2:定义事件监听器-----》下面有给出在原生code 中获取lux(onSensorChanged)

Setp3:注册事件监听器

Setp4:卸载事件监听器

图片.png

2,Lsensor UI 手动设定

在原生android P code 中,亮度的调节分为三中方式

1) 在设置中手动设定亮度方式

2) 在system UI 中手动设定亮度

3) 在播放视频时候设定亮度

上面的几种方式最后调用都到了updatePowerState(), 手动更改亮度,对自动亮度的调整有影响

2.1 System UI , 设置中进行了设定亮度

frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java

图片.png

最后背光的修改都要走到下面的函数

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java

private void animateScreenBrightness(int target, int rate) {……….}

3,Lsensor 自动算法

基本思路:

Stetp 1:创建三条曲线 lux---nits---backlight

mNitsToBacklightSpline = Spline.createSpline(nits, normalizedBacklight);

mBacklightToNitsSpline = Spline.createSpline(normalizedBacklight, nits);

mBrightnessSpline = Spline.createSpline(lux, nits);----->最重要的曲线, lux-->nits (由nits->bightlight)

Step 2:

手动调整了亮度-> addUserDataPoint(float lux, float brightness) ->重新调整曲线(mBrightnessSpline = Spline.createSpline(lux, nits))--->记录用户调整值,根据用户的习惯,重新拟合曲线

Step 3:

最后调用animateScreenBrightness,这里利用设定背光时间rate,逐步更新,达到不闪烁

3.1 code 流程

创建曲线:

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java

frameworks/base/services/core/java/com/android/server/display/BrightnessMappingStrategy.java

public DisplayPowerController(Context context,

DisplayPowerCallbacks callbacks, Handler handler,SensorManager sensorManager, DisplayBlanker blanker) {

mBrightnessMapper = BrightnessMappingStrategy.create(resources);

}

下面都是制造商的配置数组, 然后根据配置建立样条曲线

int[] brightnessLevelsBacklight---->config_autoBrightnessLcdBacklightValues

float[] luxLevels------------------>config_autoBrightnessLevels

float[] brightnessLevelsNits------->config_autoBrightnessDisplayValuesNits

float[] nitsRange------------------>config_screenBrightnessNits

int[] backlightRange -------------->config_screenBrightnessBacklight

图片.png

mBrightnessSpline = Spline.createSpline(lux, nits);

用户手动调整了亮度:

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java

frameworks/base/services/core/java/com/android/server/display/AutomaticBrightnessController.java

DisplayPowerController--> BrightnessMappingStrategy.create()-AutomaticBrightnessController-----> mAutomaticBrightnessController.configure

图片.png

下图进行了对比,默认曲线有用户调整后曲线的情况:

图片.png

问题:什么时候用户清除配置,reset 动作 (感觉nrea 不需要考虑)

1, 切换用户

2, BrightnessConfigure 重新配置

3, 屏幕由交互状态进入非交互状态时,这个是有display 状态决定

3.2 animateScreenBrightness 分析

有上面可以知道event 携带参数lux ,根据lux (利用拟合曲线)算出backlight 值,最后由animateScreenBrightness(int target, int rate)函数进行更新,在参数中就有目标target, 更新rate (分fast,slow)。

如果rate = 0 ,直接更新,可能闪屏。

如果rate > 0 ,根据rate 速度逐步进行更新背光值

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java

rate 配置:

图片.png

更新目标背光流程:

animateScreenBrightness-->mScreenBrightnessRampAnimator.animateTo(target, rate)--->postAnimationCallback();--->mAnimationCallback-->mProperty.setValue(mObject, mCurrentValue);--->

最后走到了:DisplayPowerState.java: setValue-->setScreenBrightness

图片.png

frameworks/base/services/core/java/com/android/server/display/DisplayPowerState.java:

图片.png

android背光控制 自动关闭,Android P自动背光原理相关推荐

  1. android 方向控制界面,Android Studio屏幕方向以及UI界面状态的保存代码详解

    项目:orientation package com.example.orientation; import android.os.bundle; import android.util.log; i ...

  2. android 摇杆控制方向键,Android Studio中实现摇杆

    今天和大家分享一下Android Studio实现摇杆,原理很简单,代码中有对应的注释. 实现效果图 实现代码 package com.example.fragmentcar1.view; impor ...

  3. android权限控制泄露,Android应用的权限泄露分析

    摘要: 随着智能移动终端功能和用户体验的日益完善,智能手机已经被越来越多的用户使用.研究数据表明,Android手机的购买量正在逐步超越个人电脑.Android系统被应用在越来越多的智能手机上面,但是 ...

  4. android 蓝牙控制开发,Android开发工控软件--蓝牙控制

    最近一直在忙Android的工控软件设计,写一点心得,希望对这方面开发的有一点带你帮助. 1)从蓝牙接收了数据又如何保存? 之前没有想过接收的数据如何保存,就简单的用一个字节数组进行保存,后来处理数据 ...

  5. android 代码控制音量,Android的framework层音量控制原理分析--hot(key)处理

    Android.media.AudioManager中包含了对android.media.AudioService的跨进程AIDL调用封装. 正常处理过程: 1.调整音量是通过AudioManager ...

  6. android代码控制微信,Android转战微信小程序 - vscode安装和配置

    前言 前一篇文章稍微总结了微信小程序的一些简单入门用法,这一篇文章说一下开发工具的选择,其实作为一个初次接触的萌新,微信开发者工具就能很好的作为日常的开发了,本人之所以选择vscode是刚入门时被一前 ...

  7. android语音控制demo,Android简单语音控制手机应用

    [实例简介] 通过用户语音将用户输入的语音识别出来,并完成预定义的命令操作.可作为语音识别,语音控制开发的示例代码. [实例截图] [核心代码] VoiceControl └── VoiceContr ...

  8. Android 9.0 自动背光机制分析

    在android 9.0中,相比android 8.1而言,背光部分逻辑有较大的调整,这里就对android P背光机制进行完整的分析. 1.手动调节亮度 1.1.在SystemUI.Settings ...

  9. linux蜂鸣器控制实验,【Linux公开课】蜂鸣器使用、LCD背光控制、触摸屏校准、GPIO操作...

    摘要为方便使用蜂鸣器,系统为蜂鸣器提供类似LED的操作接口,对应的操作文件是/sys/class/leds/beep/brightness.写入1使蜂鸣器鸣叫,写入0停止鸣叫- 8.12 蜂鸣器使用 ...

最新文章

  1. 三种基本排序的实现及其效率对比:冒泡排序、选择排序和插入排序
  2. 字节跳动大佬的Python自学笔记.pdf
  3. 给定一个字典,通过查找这个字典,替换给定的字符串中的中文为英文
  4. 《Python数据科学指南》——1.23 采用键排序
  5. linux系统牵引程序设置,Linux上安装Wine运行AutoCAD实例[多图]
  6. 微信小程序 蓝牙的使用
  7. HTML5新特性基础学习笔记下
  8. python print sys.stdout
  9. win10下安装Pyspider
  10. elasticsearch docker无法挂载_Docker 容器监控方案怎么选?看看这套开源方案
  11. Caffe学习:使用pycaffe绘制loss、accuracy曲线
  12. CMMI认证要求有哪些
  13. Java开发环境搭建实验报告
  14. MSAgent技术应用
  15. php宠物管理系统的开题报告,基于JSP的宠物医院开发与设计(开题报告)
  16. 声网(agora)音视频通话sdk—微信小程序demo
  17. 软件等于计算机程序加数据加什么,南航计算机软件数据结构上机实践报告
  18. Cisco PT 案例五:VLAN(Trunk模式实践)
  19. vivo和小米鸿蒙系统哪个好,vivo和华为还有小米,哪个系统流畅度更好?
  20. 全网最细------爬取4k高清大图

热门文章

  1. 线性差分方程及其通解的一般求法
  2. Nebula 来了,支付宝 App 跨平台动态化框架
  3. 数据安全和隐私保护(新生研讨课小论文)
  4. 后台怎么接收处理从url 客户端传来的json数据格式
  5. python伪造邮件发件地址_Python3学习系列(四):编写属于自己的邮件伪造工具...
  6. 我的浏览器 My Brower
  7. 微信小程序面向个人开放-附超详尽申请教程
  8. Python中文乱码问题(转)
  9. 在ELFK架构中加入kafka
  10. buck dcm占空比计算_buck电路输出电容及其他参数计算