在Android上编程更改屏幕亮度

41

我想在Android中以编程方式更改屏幕亮度。 目前我使用以下代码:

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

但是这个示例代码在杯子蛋糕版本上可以正常工作,但在最新的版本上不能。我正在使用最新版的SDK。那么对于更新的Android版本,有什么首选解决方案吗?


显示对话框时增加亮度。https://dev59.com/_G865IYBdhLWcg3wl_o3#29091233 - AZ_
请查看此博客以获取更详细的解释:https://medium.com/p/18be3eecd6b7 - Pragnesh Ghoda シ
5个回答

82

4
但是亮度值没有保存,下次设备从关机状态唤醒时不会保留...如何始终保存它,不仅限于一个窗口,而是应该适用于所有窗口.....??? - kamal_tech_view
3
获取当前亮度值的代码为:float prevBrightness = layout.screenBrightness; 可以将其保存在 onSaveInstanceState() 函数或者 sharedPreference 中。请注意,翻译过程中不能改变原文意思,也不能添加解释或其他内容。 - Patrick
6
layout.screenBrightness = -1; 或任何负值都会将屏幕亮度设置回之前的首选亮度。 - Vikram Gupta
最新的Android SDK(从5.0开始)中,您需要在首次启动时配置权限请求对话框。否则,在某些设备上,如三星S7上无法正常工作。 - CodeToLife
这会改变当前活动的亮度,但不是持久性的。要持久地改变亮度,请使用Android命令:settings put system screen_brightness [value]。该值应在0-255之间。 - Oriol Roma
请查看此博客以获取更详细的解释 https://medium.com/p/18be3eecd6b7 - Pragnesh Ghoda シ

4
在创建 Window 之前,您需要添加参数,否则会抛出 java.lang.IllegalArgumentException: Window type can not be changed after the window is added.。请参考使用 android.app.Dialog.Dialog 的示例。
final Dialog dialog = new Dialog(this) {
            @Override
            public void onAttachedToWindow() {
                super.onAttachedToWindow();
                WindowManager.LayoutParams layout = getWindow()
                        .getAttributes();
                layout.screenBrightness = 1F;
                getWindow().setAttributes(layout);
            }
        };
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        dialog.show();

请注意,亮度值介于0.0F和1.0F之间。

1

虽然回答有些晚,但我想改进一下...

我尝试了Tor-morten的代码,但它只能针对特定的屏幕进行更改,我希望能够在任何地方进行更改,因此我创建了一个服务。

根据周围光线改变Android的亮度

希望对其他人有所帮助。


1

这个问题可以尝试使用 IHardwareService 接口解决,你可以在这个 tutorial 中找到一个例子。

更新:教程链接仍然有效,但实际代码也可以在下一个答案中找到。


1
哇,一个被接受的答案 * 和 * 一个踩。也许投票者愿意解释一下他为什么这样做? - Maurits Rijk
51
我认为他这样做是因为你的答案仅包含解决方案的链接。Stackoverflow旨在直接收集示例和解决方案,链接到来源只是次要的。如果你的链接失效了,你的答案就完全失效了。如果Android界面发生变化,如果你的答案中有示例、解释和链接,我可以编辑你的答案以反映API变化。 - Janusz
2
教程链接好像挂了,@tutorial 上找不到任何源代码。 - Bhavesh Hirpara
6
DV,这不应该是被接受的答案,示例代码应该放在答案中。更不用说你正在与隐藏的API交谈。 - Chris.Jenkins

0
final Dialog dialog = new Dialog(act);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog
                .setContentView(R.layout.menubase_brightness_control);
        dialog.setCanceledOnTouchOutside(true);

        SeekBar global_brightness_control = (SeekBar) dialog
                .findViewById(R.id.global_brightness_control);
        global_brightness_control.setMax(255);
        global_brightness_control.setProgress(Settings.System.getInt(
                con.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS));

        global_brightness_control
                .setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

                    public void onStopTrackingTouch(SeekBar seekBar) {
                        // TODO Auto-generated method stub

                    }

                    public void onStartTrackingTouch(SeekBar seekBar) {
                        // TODO Auto-generated method stub

                    }

                    public void onProgressChanged(SeekBar seekBar,
                                                  int progress, boolean fromUser) {
                        Settings.System
                                .putInt(con.getContentResolver(),
                                        Settings.System.SCREEN_BRIGHTNESS, progress);
                    }
                });

        dialog.show();

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