如何检测Android设备屏幕亮度范围?解决多设备亮度适配问题
解决Android设备屏幕亮度最大值不一致的问题
你碰到的这个厂商自定义亮度刻度的问题确实头疼,不过好在Android系统提供了原生API来动态获取设备的屏幕亮度范围,完全不需要硬编码不同的常量值!
核心方案:使用系统API获取亮度极值
Android的Settings.System类提供了SCREEN_BRIGHTNESS_MAX和SCREEN_BRIGHTNESS_MIN两个常量,通过Settings.System.getInt()方法就能拿到当前设备对应的最大/最小亮度值。这样不管是小米Mi8的1024,还是其他设备的255,都能动态适配。
修改后的代码示例
结合你的原有代码,调整后如下:
protected fun setBrightness(value: Float) { // 动态获取当前设备的最大亮度值,异常时 fallback 到默认255 val maxBrightness = try { Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MAX) } catch (e: Settings.SettingNotFoundException) { e.printStackTrace() 255 } // 设置系统亮度:用0-1的value乘以设备实际最大亮度值 Settings.System.putInt( contentResolver, Settings.System.SCREEN_BRIGHTNESS, (value * maxBrightness).toInt() ) // 调整当前窗口亮度(这个参数本身就是0-1的范围,无需修改) val layoutpars = window.attributes layoutpars.screenBrightness = value window.attributes = layoutpars }
注意权限问题
要读写系统设置,你需要做两步权限配置:
- 在
AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
- Android 6.0(API 23)及以上版本,需要动态请求特殊权限:
因为WRITE_SETTINGS属于系统特殊权限,不能通过普通的requestPermissions()方法申请,需要引导用户到系统设置页开启权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.System.canWrite(context)) { val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) .setData(Uri.parse("package:" + context.packageName)) context.startActivity(intent) } }
额外提示
- 窗口亮度的
screenBrightness参数是固定的0-1范围,这个是Android系统统一定义的,所以不需要适配设备差异,直接用传入的value即可。 - 如果设备开启了自动亮度模式,设置手动亮度可能不会立即生效,你可以先关闭自动亮度(通过
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL)),再设置亮度值。
内容的提问来源于stack exchange,提问作者Grzegorz Adam Hankiewicz




