不可用的API
在Android源代码里,其实有相应的亮度调节方法。如,在DisplayManager.java中,有一个设置亮度的setTemporaryBrightness( )。无奈这里有@hide提示我们需要系统签名才可以调用到该方法,而且如果不走系统签名,势必要走反射来调用该办法。从Android 8.0开始,反射已经是Google工程师提防使用者的地方了。很多系统级方法,即使走反射这条暴力途径也取不到。
/**
724 * Temporarily sets the brightness of the display.
725 * <p>
726 * Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission.
727 * </p>
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 * <p>
740 * Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission.
741 * </p>
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中申请权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
然后,在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 ,道理同前述。
如有任何问题和疑问,欢迎大家关注我的微信公众号: