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

Posted

技术标签:

【中文标题】无法在 Android 中以编程方式应用系统屏幕亮度【英文标题】:Can't apply system screen brightness programmatically in 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);

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

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

【问题讨论】:

【参考方案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 月份发布的代码相同。这只会影响您应用的亮度,而不影响整个手机 我们称一个活动为上下文

以上是关于无法在 Android 中以编程方式应用系统屏幕亮度的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中以编程方式启用/禁用屏幕镜像。 [根]

在android中以编程方式拍摄设备快照

如何在 KitKat 4.4 中以编程方式录制 Android 屏幕视频

Android:无法在约束布局中以编程方式正确添加约束集

如何以编程方式获取 android 设备屏幕截图? [复制]

在android中以编程方式关闭shift键