2011-02-17 57 views
13

我使用以下设置系统自动亮度模式和水平:无法应用系统屏幕亮度编程中的Android

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

我可以改变自动brighess和关闭,并设置不同级别的。设置似乎正确应用 - 我可以进入设置 - >显示 - >亮度,并且无论什么时候我设置的设置实际显示正确。但是,实际屏幕不会改变其亮度。如果我只是点击显示设置中的滑块,然后一切都得到应用。

我shoudl提到,我跑withat主要活动的应用程序,并且这些设置在广播接收器得到应用。我确实试图创建一个虚拟活动并测试那里的东西,但得到了相同的结果。

回答

16

OK,在这里找到了答案: 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(),亮度会从来没有真正改变,因为布局必须在亮度设置应用之前创建。所以我最终创建了一个延迟300ms的线程,然后调用finish()。

+0

可惜这种方法不稳定可靠(Android的缺陷)。由于所有的时机,你可以找到失败的角落案例 - 例如当锁定(这里我设置新的亮度)和解锁手机。如果在这两个事件之间存在暂停,但是如果操作彼此相邻,则亮度变化将被忽略。 – greenoldman 2012-10-20 19:59:22

2

我做在我的应用程序的一个屏幕亮度类似的东西,而我通过窗口管理器做它和它的作品。我使用下面的代码来获取当前屏幕亮度(并保存供以后),并将其设置为全:

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

感谢,这绝对是一种改进,但它确实无法正常工作 - 只有在这种情况下才有效虚拟活动正在运行,并且必须打开虚拟活动才能改变环境。我试图在改变后立即完成活动,但亮度不会改变。 – user496854 2011-02-17 18:30:33

+4

此外,我只是意识到,这只控制当前活动的亮度。一旦关闭,亮度将重置为默认的系统设置。所以我们回到原来的问题 - 我如何才能将亮度系统设置应用到应用程序? – user496854 2011-02-20 03:20:06

+0

太棒了!这正是我所需要的。我直接设置屏幕亮度,并没有更新。我其实需要设置窗口属性来强制更新。干杯! – Pellet 2018-03-09 02:18:28

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

如果你正在服用的最大screenBrightness = 255,那么使用的 “user496854” 上述
给出了答案,而这样做

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