[英]How do I detect the screen brightness range on android?
我正在使用以下代码来设置屏幕亮度,这在大多数手机上都可以正常工作:
protected fun setBrightness(value: Float) {
//Set the system brightness using the brightness variable value
Settings.System.putInt(contentResolver, Settings.System
.SCREEN_BRIGHTNESS, (value * 255).toInt())
//Get the current window attributes
val layoutpars = window.getAttributes()
//Set the brightness of this window
layoutpars.screenBrightness = value
//Apply attribute changes to this window
window.setAttributes(layoutpars)
}
当我传递一个值 1 时,这意味着最大值,这被转换为 255,据说这是设置屏幕亮度的最大值。 但是,在小米 Mi8 上,将值设置为 255 不会将亮度设置为全范围,如下图所示:
打印一些调试值并进行试验后,看起来在小米 Mi8 上,最大亮度值实际上是 1024(或者至少,将该值乘以 1 设置完整的亮度条)。
似乎不同的 android 设备可能有不同的亮度等级。 是否有一些 API 可以获得亮度的最大值,所以我不需要对不同的常量进行硬编码?
使用此方法获取亮度最大值
public int getMaxBrightness(Context context, int defaultValue){
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if(powerManager != null) {
Field[] fields = powerManager.getClass().getDeclaredFields();
for (Field field: fields) {
//https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/PowerManager.java
if(field.getName().equals("BRIGHTNESS_ON")) {
field.setAccessible(true);
try {
return (int) field.get(powerManager);
} catch (IllegalAccessException e) {
return defaultValue;
}
}
}
}
return defaultValue;
}
我已经在几个设备上测试过这个(主要是 android 9、10 设备,包括一些小米设备,它们通常设置的亮度高于通常的 255),看起来这是有效的。
Google 不提倡使用反射访问隐藏字段/方法。 任何 android 更新都可能破坏此解决方案。
另一种可能的解决方案是使用反射访问 PowerManager 类中的getMaximumScreenBrightnessSetting()
方法。 但我没有测试过,因此无法确认结果。
注意:如果您使用此值来设置亮度百分比,请记住这一点:从 android 9 开始,亮度设置为对数。 因此,设置亮度百分比可能看起来不像亮度滑块中显示的百分比(较低的百分比可能看起来高于亮度滑块上的设置值),但物理亮度将设置正确。
它特定于某些小米设备。 例如小米红米 Note 7 的范围是 0-4000。
官方文档将 SCREEN_BRIGHTNESS 范围定义为 0-255。 所以,我认为没有 API 来获得亮度的最大值。
在某些(不是全部)设备上,有一个文件“/sys/class/leds/lcd-backlight/max_brightness”可以包含最大值。
而不是您将 255 设置为最大值。 我更喜欢使用这种方式将亮度设置为最大。 只需将 1F 传递给 screenBrightness。
WindowManager.LayoutParams layout = getWindow().getAttributes();
layout.screenBrightness = 1F;
getWindow().setAttributes(layout);
它在不同的安卓设备上运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.