30

我正在搜索如何以编程方式更改屏幕的亮度,我发现是一个非常好的解决方案并且效果很好,但它仅在我的应用程序处于活动状态时才有效。在我的应用程序关闭后,亮度将返回与我启动应用程序之前相同的值。

我希望能够像按下电源小部件上的亮度按钮一样更改亮度。在来自 android 的电源小部件中,有 3 种状态。一个很亮,一个很暗,一个介于两者之间。是否可以像按下此小部件时一样更改亮度?

在此处输入图像描述

Edit1:我创建了这个并在清单中添加了权限,但是当应用程序启动时,我看不到亮度有任何变化,我尝试使用 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);
}
4

5 回答 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));

我的问题中的代码不起作用,因为屏幕没有刷新。因此,刷新屏幕的一个技巧是启动虚拟活动,而不是创建要调用的虚拟活动,finish()以便亮度的变化生效。

于 2011-10-05T08:04:36.120 回答
13

在该链接中使用 Tor-Morten 的解决方案,但也要像这样设置系统亮度设置:

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

其中bright是 1 到 255 之间的整数。

于 2011-10-04T11:08:21.760 回答
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" />
于 2016-03-15T02:23:33.133 回答
8

在设置参数的同时传递活动的上下文也可以完成工作,而无需启动另一个活动。以下对我有用-

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.screenBrightness =0.00001f;// i needed to dim the display
this.getWindow().setAttributes(lp);

我在onSensorChanged()方法中有这段代码,每当它被触发时,它就会使显示器变暗。

于 2014-05-21T14:40:08.497 回答
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) {}
于 2016-03-15T02:34:18.733 回答