如何调整Android屏幕亮度

     不可用的API

       在Android源代码里,其实有相应的亮度调节方法。如,在DisplayManager.java中,有一个设置亮度的setTemporaryBrightness( )。无奈这里有@hide提示我们需要系统签名才可以调用到该方法,而且如果不走系统签名,势必要走反射来调用该办法。从Android 8.0开始,反射已经是Google工程师提防使用者的地方了。很多系统级方法,即使走反射这条暴力途径也取不到。

 /**
724     * Temporarily sets the brightness of the display.
725     * 

726 * Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission. 727 *

728 * 729 * @param brightness The brightness value from 0 to 255. 730 * 731 * @hide Requires signature permission. 732 */ 733 public void setTemporaryBrightness(int brightness) { 734 mGlobal.setTemporaryBrightness(brightness); 735 } 736 737 /** 738 * Temporarily sets the auto brightness adjustment factor. 739 *

740 * Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission. 741 *

742 * 743 * @param adjustment The adjustment factor from -1.0 to 1.0. 744 * 745 * @hide Requires signature permission. 746 */ 747 public void setTemporaryAutoBrightnessAdjustment(float adjustment) { 748 mGlobal.setTemporaryAutoBrightnessAdjustment(adjustment); 749 }

     自然,反射来调用方法是下下策,我们如何走正规途径来改变屏幕亮度?

 

     WakeLock的不便

        使用PowerManager下的WakeLock是一种有效办法。把屏幕高亮加锁,屏幕会一直保持常亮;释放该锁,屏幕就会熄灭。要使用WakeLock,需要现在AndroidManifest.xml中申请权限:

 

       然后,在Activity中申请WakeLock即可:

    ...private boolean flag = false;private PowerManager mPower;private PowerManager.WakeLock mLock;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.layout_hello);mPower = (PowerManager) getSystemService(POWER_SERVICE);mLock = mPower.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "Hello");if (!flag) {mLock.acquire();              //light up screen} else {mLock.release();              //light down screen}}

         需要说明的是newWakeLock()中有两个参数,第一个是WakeLock级别,第二个是你想打上的Tag。针对你想达到的功能,选用不同的WakeLock。WakeLock级别如下:

PARTIAL_WAKE_LOCK                  //保持CPU运转,屏幕和键盘背光可能关闭
SCREEN_DIM_WAKE_LOCK               //保持CPU运转,保持屏幕常亮(亮度低),键盘背光可能关闭 SCREEN_BRIGHT_WAKE_LOCK            //保持CPU运转,保持屏幕和键盘背光高亮
FULL_WAKE_LOCK                               //保持CPU运转,保持屏幕和键盘背光高亮(亮度最高)
ACQUIRE_CAUSES_WAKEUP              //强制亮屏,针对一些必须通知用户的操作
ON_AFTER_RELEASE                              //  当锁被释放时,保持亮屏一段时间(如果释放时屏幕没亮,则不会亮屏) PROXIMITY_SCREEN_OFF_WAKE_LOCK                 //和接近传感器配合,当用户接近屏幕时黑屏,离开时亮屏(例如打电话),该API在API21后开放,以前被hide  

     但是这有个很大的问题。因为屏幕的点亮与熄灭是取决于系统设置的。假若屏幕点亮时候的最大亮度被调得极小,那么点亮、熄灭从视觉上难以区分。因而更多用的是下面一套思路,从Settings设置角度出发,调节整个系统亮度。

    设置当前屏幕亮度

      在通过Settings调节系统亮度前,需要先知晓调节前你想要的系统亮度是多少。比如我写的getScreenBrightness( )方法,可以通过调用方法得到的返回值判断当前系统亮度。要注意的是,在Android 7.0以前,亮度值一直是0~255。之后的版本,所有的系统亮度被对应为0%~100% 。

public int getScreenBrightness(){int screenBrightness = -1;try{screenBrightness = Settings.System.getInt(getApplicationContext().getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);}catch(Settings.SettingNotFoundException e){Log.i("Brightness",e.toString());}return screenBrightness;
}

       然后,你才可以放心大胆地设置你需要调到的最低亮度,如我写的setScreenBrightness( )方法:

public void setScreenBrightness(int paramInt){try {Settings.System.putInt(getApplicationContext().getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, paramInt);Uri mUri = Settings.System.getUriFor("screen_brightness");getApplicationContext().getContentResolver().notifyChange(mUri, null);}catch (Exception e){Log.e("Brightness", e.toString());}
}

     需要注意的是,调用setScreenBrightness( )方法时,paramInt应取0~100 ,道理同前述。

  

     如有任何问题和疑问,欢迎大家关注我的微信公众号:

                                               


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部