Android SeekBar设置亮度时通知栏亮度条进度不同步问题
问题原因
你遇到的同步异常是Android系统UI的固有校验逻辑导致的,在API33版本上的表现完全符合系统规则:
Settings.System.SCREEN_BRIGHTNESS字段值为0时,会被系统判定为亮度值未初始化的异常状态,根本不会触发通知栏亮度条的进度更新,部分厂商ROM甚至会直接拦截0值的写入操作- 系统通知栏自带的亮度调节条,认可的有效手动亮度取值范围是
1~255,0是系统预留的异常占位值,不对应实际的最低亮度档位 - 如果没有提前关闭自动亮度模式,直接写入手动亮度值,也大概率会出现系统UI进度不同步的问题
- 你的原有代码还存在基础语法错误:进度文本设置行缺少闭合括号、未正确获取SeekBar最大值,同时初始化时没有同步当前系统亮度到自定义SeekBar,会导致初始进度不匹配
修复方案
你需要对原有代码做4处调整:
- 写入亮度值前先关闭系统自动亮度模式,切换到手动亮度调节状态
- 调整SeekBar的取值范围为1~255,避免写入0值触发系统的异常判定
- 页面初始化时先读取当前系统亮度,同步到自定义SeekBar,保证初始进度一致
- 补全原有代码的语法错误,移除和亮度功能无关的无效异步任务调用
修复后的完整实现代码如下:
public class MainActivity extends AppCompatActivity { private SeekBar seekBright; private TextView txtProgress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBright=findViewById(R.id.seekBright); txtProgress=findViewById(R.id.txtProgress); if(Build.VERSION.SDK_INT> Build.VERSION_CODES.M) { boolean canWriteSettings = Settings.System.canWrite(this); if (!canWriteSettings) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); startActivity(intent); } } // 设置SeekBar合法范围:最小值1,最大值255,避免写入0值 seekBright.setMax(255); seekBright.setMin(1); // 初始化时同步当前系统亮度到SeekBar int currentBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 100); seekBright.setProgress(currentBrightness); txtProgress.setText(currentBrightness + "/" + seekBright.getMax()); seekBright.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { setScreenBrightness(MainActivity.this,i); txtProgress.setText(i + "/" + seekBar.getMax()); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } public void setScreenBrightness(Context mContext, int brightnessValue){ // 先切换到手动亮度模式,保证亮度值生效 Settings.System.putInt( mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL ); // 约束亮度值在1~255的合法区间 if(brightnessValue >= 1 && brightnessValue <= 255){ Settings.System.putInt( mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightnessValue ); } } }
验证说明
调整后拖动SeekBar设置亮度为1时,就会对应系统的最低亮度档位,通知栏的亮度条会正常同步到最左端进度,1~255区间的所有值都能和系统亮度条进度完全匹配。
内容的提问来源于stack exchange,提问作者Abhi S
相关产品推荐
相关产品推荐

