【问题标题】:Can't apply system screen brightness programmatically in Android无法在 Android 中以编程方式应用系统屏幕亮度
【发布时间】:2011-06-29 06:56:47
【问题描述】:

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

    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);

我可以打开和关闭自动亮度,并设置不同的级别。设置似乎已正确应用-我可以进入设置->显示->亮度,并且我设置的设置实际上显示正确。然而,实际的屏幕并没有改变它的亮度。如果我只是点击显示设置中的滑块,那么一切都会被应用。

我应该提到我正在运行一个带有主要活动的应用程序,并且这些设置正在广播接收器中应用。我确实尝试创建一个虚拟活动并在那里测试了这些东西,但得到了相同的结果。

【问题讨论】:

    标签: android settings system brightness


    【解决方案1】:

    好的,在这里找到答案: Refreshing the display from a widget?

    基本上,必须制作一个透明的活动来处理亮度变化。帖子中没有提到的是你必须做的:

    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(),亮度将永远不会真正改变,因为必须在应用亮度设置之前创建布局。所以我最终创建了一个延迟 300 毫秒的线程,然后调用了 finish()。

    【讨论】:

    • 遗憾的是,这种方法并不可靠(Android 的缺陷)。由于所有时间,您都可以在失败时找到极端情况 - 例如在锁定(这里我设置新亮度)和解锁手机时。如果这两个事件之间有暂停,它会起作用,但如果动作彼此相邻,则更改亮度将被忽略。
    • 它将亮度永久设置为 0 或其他值,然后必须从设置中手动更改,
    【解决方案2】:

    我在我的一个应用程序中对屏幕亮度进行了类似的操作,我通过 WindowManager 进行操作,并且可以正常工作。我正在使用以下代码获取当前屏幕亮度(并将其保存以备后用)并将其设置为全屏:

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

    【讨论】:

    • 谢谢,这绝对是一个改进,但它确实不能正常工作——它只有在虚拟活动运行时才有效,并且必须打开它才能改变亮度。我尝试在更改后立即完成活动,但亮度没有改变。
    • 另外,我刚刚意识到这仅控制当前活动的亮度。关闭后,亮度将重置为默认系统设置。所以我们回到最初的问题——如何应用亮度系统设置?
    • 太棒了!这正是我所需要的。我直接设置屏幕亮度,它没有被更新。我实际上需要设置窗口属性来强制它更新。干杯!
    【解决方案3】:

    使用上面“user496854”给出的答案
    如果你正在服用 max screenBrightness =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);
    

    【讨论】:

    • 拯救了我的一天。非常感谢
    【解决方案4】:

    我在我的所有 Activity.onResume() 方法中调用的 Application 类中创建了一个静态方法。

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

    【讨论】:

    • 再一次,这不能满足我的需要——它与 Rich 在 2 月份发布的代码相同。这只会影响您应用的亮度,而不影响整个手机
    • 我们称一个活动为上下文
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 2013-08-21
    • 2011-10-06
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2010-12-15
    • 2012-08-31
    相关资源
    最近更新 更多