Android 以编程方式更改屏幕亮度(与power小部件一样)

Android 以编程方式更改屏幕亮度(与power小部件一样),android,screen,brightness,screen-brightness,Android,Screen,Brightness,Screen Brightness,我在搜索如何通过编程改变屏幕亮度,我发现这是一个非常好的解决方案,效果很好,但它只能在我的应用程序处于活动状态时工作。在我的应用程序关闭后,亮度返回到与我启动应用程序前相同的值 我希望能够改变亮度,就像我按下电源小部件上的亮度按钮一样。在来自android的power小部件中,有3种状态。一个非常明亮,一个非常黑暗,一个介于两者之间。是否可以像有人按下此小部件一样更改亮度 编辑1: 我创建了这个,并在我的清单中添加了权限,但当应用程序启动时,我看不到亮度有任何变化,我尝试了10和100,现在是

我在搜索如何通过编程改变屏幕亮度,我发现这是一个非常好的解决方案,效果很好,但它只能在我的应用程序处于活动状态时工作。在我的应用程序关闭后,亮度返回到与我启动应用程序前相同的值

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

编辑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);
}

在该链接中使用Tor Morten的解决方案,但也可以设置系统亮度设置,如下所示:

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

其中,
bright
是一个从1到255的整数。

这是我发现正在工作的完整代码:

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()
,这样亮度的更改就会生效。

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

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

我在onSensorChanged()方法中包含了这段代码,每当它被触发时,它都会使显示变暗

我今天解决了这个问题

首先,您必须将权限放入AndroidManifest.xml文件:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
现在是打开还是关闭自动模式?你可以得到这些信息

int mode = -1;
try {
    mode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); //this will return integer (0 or 1)
} catch (Exception e) {}
因此,如果要手动更改亮度,应先设置手动模式,然后再更改亮度

注:屏幕亮度模式自动为1

注:屏幕亮度模式手动为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" />

复杂示例:

    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) {}

你有没有尝试过这些不靠岸如果确实更改自定义亮度,我会遇到一些异常我想我没有权限,你知道权限吗有人知道我需要什么权限吗?我添加了权限,它不会抛出异常,但这根本不会更改亮度,你能告诉我是什么问题吗?在调整窗口亮度之前,尝试执行上面的代码。我认为在调用活动的finish()之前,您可能还需要等待一小段时间。因此,如果您在设置亮度后立即关闭它,可能会添加一个小延迟。在我运行活动后,它将保持活动状态,我不会关闭它,但它仍然不会更改亮度。是否有任何地方可以看到完整的运行代码?奇怪的是,您必须这样做。:/你用的是什么手机?这并不奇怪,我用的是htc desire,我也在三星galaxy上试过代码。。。这不是设备问题,而是android的工作方式,它只是在win manager刷新之前不会应用亮度,而win manager通过按“后退”、“主页”按钮或创建新活动来刷新亮度…如果您使用的小部件不需要刷新,但如果您将代码放入oncreate,它肯定需要额外的活动来启动(至少我是这样),如果没有虚拟活动,应用程序就无法工作property@Lukap我曾在AppWidget类中使用intent调用虚拟活动,但它强制关闭。这在HTC desire上适用于2.3版(但我从未在4.0上尝试过)。别忘了权限!否则什么都不会发生+1用于需要将屏幕亮度模式调整为手动。此外,对于API 23及更高版本,在清单中设置权限不再有效-请参阅。有关如何更改API 23及更高版本的权限的信息,请参阅。切勿将其设置为零。将其设置为0.00001f。将其设置为零将导致一些手机无限期关闭屏幕,迫使您通过按住电源按钮或卸下电池来重置手机。谢谢,修改了答案。
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
    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) {}