You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测Android设备屏幕亮度范围?解决多设备亮度适配问题

解决Android设备屏幕亮度最大值不一致的问题

你碰到的这个厂商自定义亮度刻度的问题确实头疼,不过好在Android系统提供了原生API来动态获取设备的屏幕亮度范围,完全不需要硬编码不同的常量值!

核心方案:使用系统API获取亮度极值

Android的Settings.System类提供了SCREEN_BRIGHTNESS_MAXSCREEN_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

火山引擎 最新活动