安卓设置亮度的时候,系统会在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"/>
相关推荐
dtq042418 分钟前
C语言-结构体详解
c语言·开发语言·学习
梅雅达编程笔记30 分钟前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
持力行31 分钟前
C++与Java变量声明、定义及内存分配的核心区别
java·开发语言·c++
jinyishu_2 小时前
C++ 继承全解:从基础到高级特性
开发语言·c++
AFinalStone2 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络
接着奏乐接着舞3 小时前
大模型开发 agent 知识库
java
xuhaoyu_cpp_java3 小时前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev3 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台3 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
小喻同学i4 小时前
std::thread函数参数传递
开发语言·c++