如何调整Android屏幕亮度

     不可用的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 ,道理同前述。

  

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

                                               

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值