以编程方式更改系统亮度

56

我想通过编程改变系统的亮度。出于这个目的,我正在使用以下代码:

WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = (255);
window.setAttributes(lp);

因为我听说最大值是255。

但它没有任何效果。请建议任何可以改变亮度的东西。谢谢。


类似问题:https://dev59.com/_G865IYBdhLWcg3wl_o3 - Dhairya Vora
这是一个老问题。我已经在本页面底部提供了完整的答案。希望能节省大家的时间。 - Hitesh Sahu
请查看这篇博客。https://medium.com/p/18be3eecd6b7 - Pragnesh Ghoda シ
https://androidacademic.blogspot.com/2023/03/change-android-screen-brightness.html - Pragnesh Ghoda シ
16个回答

2
<uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />

android.provider.Settings.System.putInt(getContentResolver(),
                    android.provider.Settings.System.SCREEN_BRIGHTNESS,
                    progress);

你必须先请求写入权限。否则会抛出“java.lang.SecurityException: com.myExamlpe未被授予此权限:android.permission.WRITE_SETTINGS。”,应用程序将崩溃。 - Tarun Kumar

1
您需要创建变量: private WindowManager.LayoutParams mParams;
然后覆盖此方法(以保存先前的参数):
@Override
public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
    mParams = params;
    super.onWindowAttributesChanged(params);
}

如果您想更改屏幕亮度(在应用程序上),只需使用:

    mParams.screenBrightness = 0.01f; //use a value between 0.01f for low brightness and 1f for high brightness
    getWindow().setAttributes(mParams);

在API版本28上进行测试。


1
请尝试这个,它可能会对您有帮助。对我来说运行良好。
根据我的经验。
 1st method.
                     WindowManager.LayoutParams lp = getWindow().getAttributes();  
                 lp.screenBrightness = 75 / 100.0f;  
                 getWindow().setAttributes(lp);

亮度值在1.0f到100f之间时,表示最大亮度。

上述代码将增加当前窗口的亮度。如果我们想要增加整个Android设备的亮度,这段代码是不够的,我们需要使用其他方法。

   2nd method.



       android.provider.Settings.System.putInt(getContentResolver(),
                         android.provider.Settings.System.SCREEN_BRIGHTNESS, 192); 

其中192是亮度值,范围从1到255不等。使用第二种方法的主要问题在于它会以增加的形式显示亮度在Android设备上,但实际上它将无法增加Android设备的亮度。这是因为它需要一些刷新。

这就是为什么我通过同时使用两个代码找出了解决方案。

            if(arg2==1)
                {

         WindowManager.LayoutParams lp = getWindow().getAttributes();  
                 lp.screenBrightness = 75 / 100.0f;  
                 getWindow().setAttributes(lp);  
                 android.provider.Settings.System.putInt(getContentResolver(),
                         android.provider.Settings.System.SCREEN_BRIGHTNESS, 192);


                    }

它对我来说正常工作。


0

这就是了,简短而精炼;Kotlin版本。

/**
 * This can be used to override the user's preferred brightness of the screen.
 * A value of less than 0, the default, means to use the preferred screen brightness.
 * 0 to 1 adjusts the brightness from dark to full bright!
 */

fun Fragment.screenBrightness(x: Float) = activity?.screenBrightness(x)
fun Activity.screenBrightness(x: Float) = window?.apply {
        attributes = attributes?.apply { screenBrightness = x.coerceIn(-1f..1f) } }

也进行了Kdoc注释!


0

我刚刚在研究 Android 10 的这个问题,这个方法对我仍然有效。但是需要在片段中获取调用 Activity 实例,这不是最优的方式,因为现在我们只能从 onAttach 中获取上下文。将其设置为 -1.0f 将其设置为系统值(亮度设置滑块中的值),将 0.0f 到 1.0f 设置为您喜欢的最小到最大亮度值。

    WindowManager.LayoutParams lp = myactivity.getWindow().getAttributes();
    lp.screenBrightness = brightness;
    myactivity.getWindow().setAttributes(lp);
    myactivity.getWindow().addFlags(WindowManager.LayoutParams.FLAGS_CHANGED);

0

我正在使用这个工具类 适用于Android 9

public class BrightnessUtil {

public static final int BRIGHTNESS_DEFAULT = 190;
public static final int BRIGHTNESS_MAX = 225;
public static final int BRIGHTNESS_MIN = 0;

public static boolean checkForSettingsPermission(Activity activity) {
    if (isNotAllowedWriteSettings(activity)) {
        startActivityToAllowWriteSettings(activity);
        return false;
    }
    return true;
}

public static void stopAutoBrightness(Activity activity) {

    if (!isNotAllowedWriteSettings(activity)) {
        Settings.System.putInt(activity.getContentResolver(),
                Settings.System.SCREEN_BRIGHTNESS_MODE,
                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
    }

}

public static void setBrightness(Activity activity, int brightness) {

    if (!isNotAllowedWriteSettings(activity)) {
        //constrain the value of brightness
        if (brightness < BRIGHTNESS_MIN)
            brightness = BRIGHTNESS_MIN;
        else if (brightness > BRIGHTNESS_MAX)
            brightness = BRIGHTNESS_MAX;


        ContentResolver cResolver = activity.getContentResolver();
        Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
    }
}

private static void startActivityToAllowWriteSettings(Activity activity) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + activity.getPackageName()));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    activity.startActivity(intent);
}

@SuppressLint("ObsoleteSdkInt")
private static boolean isNotAllowedWriteSettings(Activity activity) {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.System.canWrite(activity);
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接