最近测试同学反馈FinClip小程序Android端使用ft.getScreenBrightness API获取屏幕亮度,在小米10Pro Android 13机型上返回的值不准确。
首先来看一下ft.getScreenBrightness API的文档说明:
getScreenBrightness(Object object)
获取屏幕亮度。
...
参数
Object res
| 属性 | 类型 | 说明 |
|---|---|---|
| value | number | 屏幕亮度值,范围 0 ~ 1,0 最暗,1 最亮 |
可以看到getScreenBrightness返回值为0 ~ 1的数值,0为最暗,1为最亮
先来验证一下问题,在小米10Pro Android 13机型上:
- 通过下拉控制面板将屏幕亮度拉到最大
- 在小程序内调用ft.getScreenBrightness将返回的值显示到页面上
可以看出,当把屏幕亮度设置为最大时,getScreenBrightness返回的值并非为1,而只有0.1,明显偏小了
再来看看FinClip Android SDK内对应小程序ft.getScreenBrightness API的方法实现:
/**
* 获取屏幕亮度
*/
private fun getScreenBrightness(): Float {
val maxBrightness = max(getMaxScreenBrightness(), 255)
val brightness =
Settings.System.getFloat(activity.contentResolver, Settings.System.SCREEN_BRIGHTNESS) /
maxBrightness
return brightness
}
/**
* 获取最大屏幕亮度
*/
private fun getMaxScreenBrightness(): Int {
try {
val system = Resources.getSystem()
val resId = system.getIdentifier(
"config_screenBrightnessSettingMaximum", "integer", "android"
)
if (resId != 0) {
return system.getInteger(resId)
}
} catch (e: Exception) {
e.printStackTrace()
}
return 255
}
其中getScreenBrightness方法返回的就是小程序ft.getScreenBrightness API的获取的值,方法逻辑也比较简单:获取当前屏幕亮度,然后除以屏幕最大亮度,得出比例。
从上面的测试表现先怀疑是获取的屏幕最大亮度值不准确,经过一番搜索,果然有所发现,在小米开发者文档上专门有一篇章节对屏幕亮度适配做出了说明:dev.mi.com/xiaomihyper…
于是按照小米开发者文档说明上的建议,调整了获取屏幕最大亮度getMaxScreenBrightness方法的实现:
private fun getMaxScreenBrightness(): Int {
try {
return PowerManager::class.java.getDeclaredField("BRIGHTNESS_ON")[null] as Int
} catch (e: IllegalAccessException) {
e.printStackTrace()
} catch (e: NoSuchFieldException) {
e.printStackTrace()
}
return 255
}
此时再运行小程序调用ft.getScreenBrightness将返回的值显示到页面上,当屏幕亮度最大时,显示为1:
问题得到解决。
然而。。。 测试同学依旧反馈ft.getScreenBrightness值不准确,如系统设置屏幕亮度为50%时,小程序显示的是0.1,屏幕亮度为80%时,小程序显示的是0.4。。。
经过进一步分析、验证,原来这是手机厂商为了亮度调节更加符合用户使用场景所做出的优化,当调节的亮度水平越低时,调节越精细,当调节的亮度水平越高时,调节的精度则降低,简单理解就是:系统设置亮度调节滑块时,把更长的区域给了调节低亮度区间,更短的区域范围给了调节高亮度区间,因此才出现了,滑块50%对应0.1亮度,滑块80%对应0.4亮度的表现。