繁体   English   中英

如何检测android上的屏幕亮度范围?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM