以编程方式更改屏幕亮度(如使用电源小部件)

30
我正在搜索如何在程序中改变屏幕亮度,我找到了这个非常好的解决方案,它运行良好,但仅在我的应用程序处于活动状态时才有效。当我的应用程序关闭后,亮度将返回到启动应用程序之前相同的值。
我希望能够像按下电源小部件上的亮度按钮一样改变亮度。在Android中提供的电源小部件中有3种状态。一个非常明亮,一个非常暗,一个介于两者之间。是否可以像按下此小部件时一样更改亮度?

enter image description here

编辑1: 我创建了这个并且在我的清单中添加了权限,但是当应用程序启动时,我没有看到任何亮度变化,我尝试使用10、100和现在的200,但没有变化。 有什么建议吗?

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
android.provider.Settings.System.putInt(this.getContentResolver(),
        android.provider.Settings.System.SCREEN_BRIGHTNESS, 200);
}

你试过这些吗?https://dev59.com/OG865IYBdhLWcg3wU9GI 不确定它们是否改变了自定义亮度属性。 - PedroAGSantos
5个回答

40

这是我找到的完整可工作代码:

Settings.System.putInt(this.getContentResolver(),
        Settings.System.SCREEN_BRIGHTNESS, 20);

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness =0.2f;// 100 / 100.0f;
getWindow().setAttributes(lp);

startActivity(new Intent(this,RefreshScreen.class));

我的问题中的代码不能工作,因为屏幕没有得到刷新。所以,一个关于刷新屏幕的技巧是启动虚拟活动,然后在该虚拟活动的on create方法中调用finish(),这样亮度的更改就会生效。


1
这并不奇怪,我使用的是HTC Desire,我也在三星Galaxy上尝试了这段代码... 这不是设备问题,而是Android系统的工作方式,它只有在窗口管理器刷新后才会应用亮度设置,而窗口管理器则通过按下返回、主页按钮或创建新活动来进行刷新... - Lukap
也许如果您使用小部件,则不需要刷新,但是如果您将代码放在 onCreate 中,则肯定需要启动额外的活动(至少在我的情况下是如此)。没有这个虚拟活动,应用程序无法正常工作。 - Lukap
这个设置会对其他活动生效吗,还是只对当前活动有效?假设我想让用户自动调暗手机屏幕,如果他们选择的话。我不希望这段代码阻碍这一功能。 - IgorGanapolsky
+1 谢谢,伙计,它对我有用(4.1.2),再次感谢。 - Simon Dorociak
我如何使用按鈕點擊更改亮度,並使用值如100%、50%、10%、20%、自動以及再次100%、50%等。@Lukap - Erum
显示剩余3条评论

13

请使用Tor-Morten在链接中提供的解决方案,然后按以下方式设置系统亮度:

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

bright 是一个范围为1到255的整数时。


在调整窗口亮度之前,请尝试执行上述代码。我认为在调用Activity的finish()之前,您可能需要等待一小段时间。因此,如果您在设置亮度后立即关闭它,可以添加一个小延迟。 - Glitch
运行活动后,它仍然保持活动状态,我没有关闭它,但是它仍然没有改变亮度。有没有地方可以看到完整的运行代码? - Lukap
@Lukap 它可以处理10、20的值,但为什么无法处理50、100的值? - Erum
我认为它进行了调整,但它没有刷新窗口,所以当前亮度无法工作。我不知道该如何解决它... - Peter Zhu
为了使这个答案有效,我先设置了手动亮度模式,然后设置了亮度级别。Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness); - Kevin Lee
显示剩余3条评论

10

我今天解决了这个问题。

首先,您需要将权限添加到AndroidManifest.xml文件中:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />

它应该放在文件的确切位置是什么?

<manifest>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <application>
        <activity />
    </application>
</manifest>

该权限允许您更改影响其他应用程序的设置。

现在,您可以打开或关闭自动亮度模式。

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);  //this will set the automatic mode on
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);  //this will set the manual mode (set the automatic mode off)

自动模式现在是否已打开或关闭?您可以获取此信息。

int mode = -1;
try {
    mode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); //this will return integer (0 or 1)
} catch (Exception e) {}

如果您想手动更改亮度,您需要首先设置手动模式,然后才能更改亮度。

注:SCREEN_BRIGHTNESS_MODE_AUTOMATIC为1

注:SCREEN_BRIGHTNESS_MODE_MANUAL为0

您应该使用这个。

if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
    //Automatic mode
} else {
    //Manual mode
}

不要使用这个

if (mode == 1) {
    //Automatic mode
} else {
    //Manual mode
}

现在你可以手动调节亮度了

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness);  //brightness is an integer variable (0-255), but dont use 0

并且阅读亮度

try {
    int brightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);  //returns integer value 0-255
} catch (Exception e) {}

现在一切都设置好了,但是...你仍然看不到变化。

你需要做一件事来看到变化!

刷新屏幕...这样做:

    try {
        int br = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);  //this will get the information you have just set...

        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = (float) br / 255; //...and put it here
        getWindow().setAttributes(lp);
    } catch (Exception e) {}

不要忘记权限...

<uses-permission android:name="android.permission.WRITE_SETTINGS" />

1
需要将屏幕亮度模式调整为手动模式。另外,对于API 23及以上版本,设置清单中的权限已不再起作用 - 请参见https://developer.android.com/training/permissions/requesting.html。请参见https://dev59.com/F1wY5IYBdhLWcg3wup9c以了解如何更改API 23及以上版本的权限。 - Ying

8
设置参数时传递活动的上下文,也可以完成任务,而无需启动另一个活动。以下是我成功使用的代码示例:
WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.screenBrightness =0.00001f;// i needed to dim the display
this.getWindow().setAttributes(lp);

我有一个代码块在onSensorChanged()方法中,每当触发时会使显示屏变暗。


4
永远不要将其设为零。将其设为0.00001f。将其设为零会导致一些手机屏幕无限期地关闭,强制你通过按住电源按钮或移除电池来重置手机。 - Tim Cooke
1
谢谢,已修改答案。 - Deepak Negi

4

复杂示例:

    try {
        //sets manual mode and brightnes 255
        Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);  //this will set the manual mode (set the automatic mode off)
        Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 255);  //this will set the brightness to maximum (255)

        //refreshes the screen
        int br = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = (float) br / 255;
        getWindow().setAttributes(lp);

    } catch (Exception e) {}

<uses-permission android:name="android.permission.WRITE_SETTINGS" /> - PEPAN
别忘了权限!否则什么都不会发生! - PEPAN

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