如何调整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 ,道理同前述。
如有任何问题和疑问,欢迎大家关注我的微信公众号:

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