我在Android
应用程序中添加了搜索栏。我可以使用SeekBar
改变系统的亮度。
binding.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
@RequiresApi(api = Build.VERSION_CODES.M)
override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
val permission = Settings.System.canWrite(applicationContext)
if (permission) {
var brightnessValue = p1 * 255 / 100
Settings.System.putInt(
applicationContext.contentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC)
Settings.System.putInt(contentResolver, SCREEN_BRIGHTNESS, brightnessValue)
binding.seekBar.progress = brightnessValue
} else {
val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
intent.data = Uri.parse("package:" + applicationContext.packageName)
startActivityForResult(intent, 0)
}
}
override fun onStartTrackingTouch(p0: SeekBar?) {
}
override fun onStopTrackingTouch(p0: SeekBar?) {
}
})
这是我如何在SeekBar
上看到系统的变化。
val contentObserver: ContentObserver = object : ContentObserver(Handler()) {
override fun onChange(selfChange: Boolean) {
val a = Settings.System.getInt(contentResolver, SCREEN_BRIGHTNESS, 0)
Log.d("MainActivity", "Brightness value: $a")
binding.seekBar.progress = a* 255 / 100
}
}
contentResolver.registerContentObserver(
Settings.System.getUriFor(SCREEN_BRIGHTNESS),
false, contentObserver
)
这是特定于一些小米设备。例如,小米红米Note 7有0-4000
范围。官方文档将screen_亮度范围定义为0-255
。所以,我认为没有API来获得亮度的最大值。
当我同时使用两者时,代码无法工作。当我从系统中更改它时,以及当我在SeekBar
上更改它时,我如何才能使它正确工作?
我不知道你的实际问题是什么,但如果它们单独工作而不是一起工作,你可能会有一个反馈循环,其中搜索栏更改引起亮度变化导致查找栏更改导致亮度变化…
如果是这种情况,你可能想看看你的OnSeekbarChangeListener.onProgressChanged
回调-你不能从你那里的参数名称,但最后一个参数是一个布尔值,告诉你是否改变是由用户交互引起的(即移动滑块)或不是(即值是通过编程设置的):
public abstract void onProgressChanged (SeekBar seekBar,
int progress,
boolean fromUser)
所以你可以在onProgressChanged
中检查fromUser
,只有当fromUser
为true时才设置系统亮度-否则你的更新是来自亮度变化本身,你不想再设置它。