无法在 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 中以编程方式启用/禁用屏幕镜像。 [根]
如何在 KitKat 4.4 中以编程方式录制 Android 屏幕视频