先放代码
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"/>