Android 传感器(四)— 使用光线传感器实现自动调节页面亮度

大部分手机都有跟随外界光照强度自动调节屏幕亮度的功能,如果用手挡住前置摄像头区域屏幕会自动变暗,移开手后会自动变亮。本文介绍如何使用光线传感器实现类似的效果。

实现自动调节页面亮度

调节系统亮度需要申请权限,调节App中页面的亮度则不需要权限,本文以调节App中页面的亮度为例进行演示。

调节页面亮度

通过设置WindowManager.LayoutParamsscreenBrightness来调节App中页面的亮度,screenBrightness的取值范围为 0(最暗)~ 1(最亮),只对当前设置的页面生效,代码如下:

kotlin 复制代码
class SensorExampleActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
            window.attributes = window.attributes.apply {
                screenBrightness = 1f
            }
    }
}

照度

光线传感器返回的数值为照度,单位为lxlux,照度用于描述特定区域或表面上接收到的光的强度。它表示单位面积上接收到的光能量的数量。照度是衡量环境光亮度的指标,它可以用来描述室内和室外环境的亮度水平,以及人眼感知到的光的强度。较高的照度值表示较亮的环境,而较低的照度值表示较暗的环境。光线传感器通过将光转换为电信号来检测光的强度,并返回一个数值表示当前环境的照度水平。

SensorManager中定义了几个常量,表示在某些特定环境下照度对应的数值,如下:

常量值 取值 备注
LIGHT_SUNLIGHT_MAX 120000.0F 阳光直射时的最大光照强度
LIGHT_SUNLIGHT 110000.0F 阳光直射时的光照强度
LIGHT_SHADE 20000.0F 有树荫或遮挡物时的光照强度
LIGHT_OVERCAST 10000.0F 阴天时的光照强度
LIGHT_SUNRISE 400.0F 日出时的光照强度
LIGHT_CLOUDY 100.0F 多云天气时的光照强度
LIGHT_FULLMOON 0.25F 满月时的光照强度
LIGHT_NO_MOON 0.001F 无月光时的光照强度

使用光线传感器自动调节页面亮度

显然WindowManager.LayoutParamsscreenBrightness传入的值即为设备最大亮度的比例值。通过光线传感器获取到照度之后,需要通过一个参考值来计算获取到的照度值占参考照度值的比例。本文简单以LIGHT_CLOUDY作为参考,实现代码如下:

kotlin 复制代码
class SensorExampleActivity : AppCompatActivity() {

    private lateinit var binding: LayoutSensorExampleActivityBinding
    private lateinit var sensorManager: SensorManager
    private var lightSensor: Sensor? = null

    private val sensorEventListener = object : SensorEventListener {
        override fun onSensorChanged(event: SensorEvent?) {
            // 传感器数据变化时回调此方法
            when (event?.sensor?.type) {
                Sensor.TYPE_LIGHT -> {
                    // 改变窗口的亮度
                    window.attributes = window.attributes.apply {
                        // 以多云天气时的光照强度作为参考值计算屏幕亮度该设置多少
                        binding.tvTextContent.run { post { text = "照度:${event.values[0]}, 屏幕亮度:${event.values[0] / SensorManager.LIGHT_CLOUDY}" } }
                        screenBrightness = event.values[0] / SensorManager.LIGHT_CLOUDY
                    }
                }
            }
        }

        override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
            // 传感器的精度发生变化时回调此方法,通常无需做处理
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = LayoutSensorExampleActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.includeTitle.tvTitle.text = "Sensor Example"
        binding.tvTextContent.visibility = View.VISIBLE

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
    }

    override fun onResume() {
        super.onResume()
        lightSensor?.let {
            // 注册传感器监听并且设置数据采样延迟
            // SensorManager.SENSOR_DELAY_FASTEST 延迟0微妙
            // SensorManager.SENSOR_DELAY_GAME 演示20000微妙
            // SensorManager.SENSOR_DELAY_UI 延迟60000微妙
            // SensorManager.SENSOR_DELAY_NORMAL 延迟200000微秒
            sensorManager.registerListener(sensorEventListener, it, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_GAME)
        }
    }

    override fun onPause() {
        super.onPause()
        // 移除传感器监听
        sensorManager.unregisterListener(sensorEventListener)
    }
}

效果如图:

示例

演示代码已在示例Demo中添加。

ExampleDemo github

ExampleDemo gitee

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui