安卓设置亮度的时候,系统会在100%与0%反复横跳

先放代码

复制代码
    private fun saveBrightness(
        resolver: ContentResolver,
        brightness: Int,
        Exception: (() -> Unit)? = null
    ) {
        try {
            Settings.System.putInt(
                resolver, Settings.System.SCREEN_BRIGHTNESS,
                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
            )
            val uri =
                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS)

            Settings.System.putInt(
                resolver,
                Settings.System.SCREEN_BRIGHTNESS,
                brightness
            )
            resolver.notifyChange(uri, null)
        } catch (e: Exception) {
            Exception!!.invoke()
        }

    }

问题根源:先切手动模式、再写亮度,时序反了 → 系统自动亮度服务抢值,来回 0/100% 反复弹跳
原理:
SCREEN_BRIGHTNESS_MODE_AUTOMATIC=0(自动) / MANUAL=1(手动)

(1).自动模式 (0):ALS 光感 + DisplayManagerService 持续轮询、自动刷新SCREEN_BRIGHTNESS,不停覆写数值;

(2).手动模式 (1):系统停止光感自动刷新,写入的值才锁死生效。如果先写 MODE_MANUAL,紧接着 putInt 亮度,部分 Android 系统定制 ROM (原厂平板 / 工控) 有系统异步刷新 bug:

切手动瞬间,自动亮度服务还在后台最后一次回写旧值 → 你的代码写入新值 ↔ 系统自动回写旧值 互相覆盖、来回拉锯 → 亮度 0/100 反复跳变

2 种方案,优先方案 1

复制代码
方案 1:先设亮度 → 再切手动(根治跳动,推荐)
kotlin
private fun saveBrightness(
    resolver: ContentResolver,
    brightness: Int,
    onError: (() -> Unit)? = null
) {
    try {
        // 顺序关键:先写入亮度,再切手动锁定
        Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightness)
        // 写完亮度再切换手动模式,阻断自动服务覆写
        Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
            Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL)
    } catch (e: Exception) {
        onError?.invoke()
    }
}

方案 2:切模式后短暂延时再写(适配顽固定制系统)
kotlin
// 切MANUAL后postDelay 30~50ms再put亮度,避开系统异步刷新窗口期
Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL)
handler.postDelayed({
    Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, brightness)
}, 50)

补充关键细节
权限必须齐全
AndroidManifest.xml添加:

复制代码
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
相关推荐
JAVA面经实录9172 小时前
SpringBoot3企业实战项目开发文档(完整版)
java·spring boot
郝学胜-神的一滴2 小时前
Qt 高级开发 025:打造优雅界面的艺术与高效重构之道
开发语言·c++·qt·程序人生·重构·软件构建·用户界面
帅次2 小时前
Android 高级工程师面试参考答案:Kotlin MVVM 高频题、追问与项目表达
android·面试·职场和发展·kotlin
一晌小贪欢2 小时前
第19节:地理空间分析——使用 Geopandas 绘制热力地图
开发语言·python·数据分析·pandas·数据可视化
Byte Wizard2 小时前
C语言文件操作
c语言·开发语言
zzqssliu2 小时前
Taocarts库存锁定机制优化:彻底解决跨境代购商品超卖问题
java·linux·javascript·php
scan7242 小时前
SystemMessage,HumanMessage,AIMessage,ToolMessage
开发语言·前端·javascript
唔662 小时前
在 Flutter 混合开发中,Android 原生层通知 Dart 界面更新状态
android·flutter
故渊at2 小时前
系列一:架构思想进阶 | 第1篇 Android 架构演进实录:从 MVC 的“万能类”到 MVVM 的数据驱动
android·架构·mvc