无法在Android中以编程方式应用系统屏幕亮度

15

我正在使用以下代码设置系统的自动亮度模式和级别:

    android.provider.Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
    android.provider.Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, y.brightness1);

我可以打开和关闭自动亮度,并设置不同的亮度级别。应用程序似乎已经正确地应用了这些设置,因为我可以进入“设置”-“显示”-“亮度”,并且无论我设置什么都能正确显示。然而,实际屏幕并没有改变其亮度。如果我只是在“显示设置”中点击滑块,那么所有设置都会被应用。

我应该提到我正在运行一个主活动(main activity)的应用程序,并且这些设置正在BroadcastReceiver中应用。我尝试创建了一个虚拟活动(dummy activity),并在那里进行了测试,但得到了相同的结果。

4个回答

17

好的,我在这里找到了答案:如何从小部件刷新显示?

基本上,必须创建一个透明的Activity来处理亮度改变。帖子中没有提到的是你必须执行以下操作:

Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, brightnessLevel); 

那么就执行

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

如果你在应用更改后立即调用finish(),亮度永远不会实际改变,因为必须在应用亮度设置之前创建布局。所以我最终创建了一个具有300ms延迟的线程,然后调用finish()。


可惜这个方法不是非常可靠(Android的缺陷)。由于所有时间都可以找到它失败的边角情况--例如锁定(这里我设置新的亮度)和解锁手机时。如果这两个事件之间有暂停,它可以工作,但如果这些操作相邻,改变亮度将被忽略。 - greenoldman
它会永久将亮度设置为0或其他值,必须手动从设置中更改。 - Saqib

2

我在我的一个应用程序中正在使用WindowManager来控制屏幕亮度,以下是我使用的代码,可以获取当前屏幕亮度并将其设置为最大值:

    WindowManager.LayoutParams lp = getWindow().getAttributes();
    previousScreenBrightness = lp.screenBrightness;
    float brightness = 1;
    lp.screenBrightness = brightness; 
    getWindow().setAttributes(lp); 

2
谢谢,这绝对是一个改进,但它并不能正常工作——只有当虚拟活动正在运行时才能工作,并且必须打开它才能改变亮度。我尝试让活动在更改后立即结束,但是亮度就不会改变。 - user496854
4
我刚刚意识到这只控制当前活动的亮度。一旦关闭,亮度就会重置为默认的系统设置。因此,我们又回到了最初的问题--如何让系统的亮度设置生效? - user496854
太棒了!这正是我所需要的。我一直在直接设置屏幕亮度,但它并没有被更新。实际上,我需要设置窗口属性来强制更新。谢谢! - Pellet

2

请使用上面"user496854"提供的答案。
如果您正在设置最大屏幕亮度为255,那么在执行时

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

将screenBrightness除以255,如下:

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = brightness/(float)255;   
getWindow().setAttributes(lp);

1
我在我的应用程序类中创建了一个静态方法,我从所有的Activity.onResume()方法中调用它。
MyApplication extends Application {
    ...
    public static void setBrightness(final Activity context) {
        // get the content resolver
        final ContentResolver cResolver = context.getContentResolver();
        // get the current window
        final Window window = context.getWindow();

        try {
            // get the current system brightness
            int brightnessLevel = System.getInt(cResolver,System.SCREEN_BRIGHTNESS);
            // get the current window attributes
            LayoutParams layoutpars = window.getAttributes();
            // set the brightness of this window
            layoutpars.screenBrightness = brightnessLevel / (float) 255;
            // apply attribute changes to this window
            window.setAttributes(layoutpars);
        } catch (SettingNotFoundException e) {
            // throw an error cuz System.SCREEN_BRIGHTNESS couldn't be retrieved
            Log.e("Error", "Cannot access system brightness");
            e.printStackTrace();
        }
    }
}

MyActivity extends Activity {
    ...
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume()");
        MyApplication.setBrightness(this);
    }
}

1
再说一遍,这不是我需要的——这与Rich在二月份发布的代码相同。这只会影响您应用程序的亮度,而不是整个手机。 - user496854
让我们把Activity称作上下文。 - Kevin Parker

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