安卓设置亮度的时候,系统会在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"/>
相关推荐
且从容.1 分钟前
JS篇-----
java·javascript·jvm
夜之眷属1 分钟前
记一次战斗服务器 CPU 打满 100% 且“无法恢复“的排查
java·linux·运维·服务器·后端·性能优化
墨天梦4 分钟前
B13_通知图片相机与影音
android·数码相机·kotlin
starzy19906 分钟前
Flink ResourceManager启动流程源码深度剖析:从ClusterEntrypoint到Slot分配的完整链路
java·大数据·flink
悠仁さん7 分钟前
【C++】auto
java·前端·c++
郝学胜-神的一滴12 分钟前
C++ Templates 07:编译报错和调试手段与实战技巧
开发语言·c++·后端·软件工程·visual studio
害人终害己20 分钟前
Redisson 连接 Redis 失败 报错解决方案
java·开发语言
学编程就要猛28 分钟前
Spring AI Alibaba(上)
java·人工智能·spring·springaialibaba
事圆则缓29 分钟前
Android 一次性事件怎么设计:Channel、SharedFlow 还是 UI State?
android·ui
jimy130 分钟前
c++的静态类型和动态类型(二)
开发语言·c++