Android亮度调整解析

本文深入探讨了Android系统亮度调整的多种方式,包括自动与手动模式的区别、亮度值的获取与设置、不同模式下亮度值的转换,以及如何监听亮度变化并避免内存泄露。特别强调了在Android6.0以上系统中进行系统变量操作时动态权限申请的重要性。

干货总结,Android亮度调整有一下一些知识点需要注意:

1、Android亮度调整,包括调整系统亮度和调整指定Activity亮度。

2、Android系统亮度模式有两种,自动模式和手动模式。

3、自动模式下和手动模式下获取系统亮度值的方式不一样,具体请看代码(谢谢老大指点,差点以为没办法获取自动模式下的亮度)。

4、系统亮度值的区间为[0, 255]。需要注意的是,自动亮度模式下,直接获取到的系统亮度值区间为[-1,1]。

5、这一点可能很多人没注意,调整过Activity亮度之后,系统亮度调整在当前Activity中会失效。

6、系统亮度变化值,可以通过监听系统属性值变化获得,具体看代码。

7、Android 6.0 及以上系统,对系统变量相关操作,需要硬编码动态申请权限。

8、动态监听系统亮度变化,注意防止内存泄露。

 

好了,干货,请看代码,看代码,看代码

 

一、工具类BrightnessUtils

 

public class BrightnessUtils {  private static final String TAG = BrightnessUtils.class.getSimpleName();
    /**  * 判断是否开启了自动亮度调节  */  public static boolean isAutoBrightness(Activity activity) {
        boolean automicBrightness = false;
        try {
            automicBrightness = Settings.System.getInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
        } catch (Settings.SettingNotFoundException e){
            e.printStackTrace();
        }
        return automicBrightness;
    }

    /**  * 获取屏幕的亮度  */  public static int getScreenBrightness(Activity activity) {
// int nowBrightnessValue = 0; // ContentResolver resolver = activity.getContentResolver(); // try { // nowBrightnessValue = android.provider.Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS); // } catch (Exception e) { // e.printStackTrace(); // } // return nowBrightnessValue;   if(isAutoBrightness(activity)){
            return getAutoScreenBrightness(activity);
        }else{
            return getManualScreenBrightness(activity);
        }
    }

    /**  * 获取手动模式下的屏幕亮度  */  public static int getManualScreenBrightness(Activity activity) {
        int nowBrightnessValue = 0;
        ContentResolver resolver = activity.getContentResolver();
        try {
            nowBrightnessValue = android.provider.Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return nowBrightnessValue;
    }

    /**  * 获取自动模式下的屏幕亮度  */  public static int getAutoScreenBrightness(Activity activity) {
        float nowBrightnessValue = 0;
        ContentResolver resolver = activity.getContentResolver();
        try {
            nowBrightnessValue = android.provider.Settings.System.getFloat(resolver, "screen_auto_brightness_adj"); //[-1,1],无法直接获取到Setting中的值,以字符串表示  Log.d(TAG, "[ouyangyj] Original AutoBrightness Value:" + nowBrightnessValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
        float tempBrightness = nowBrightnessValue + 1.0f; //[0,2]  float fValue = (tempBrightness/2.0f)*225.0f;
        Log.d(TAG,"[ouyangyj] Converted Value: " + fValue);
        return (int)fValue;
    }

    /**  * 设置亮度  */  public static void setBrightness(Activity activity, int brightness) {
        // Settings.System.putInt(activity.getContentResolver(),  // Settings.System.SCREEN_BRIGHTNESS_MODE,  // Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);  try{
            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
            lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f);
            MLog.debug(TAG, "set lp.screenBrightness == " + lp.screenBrightness);
            activity.getWindow().setAttributes(lp);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    /**  * 停止自动亮度调节  */  public static void stopAutoBrightness(Activity activity) {
        try{
            Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
        }catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**0  * 开启亮度自动调节  * @param activity  */  public static void startAutoBrightness(Activity activity) {
        try{
            Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

    /**  * 保存亮度设置状态  */  public static void saveBrightness(Activity activity, int brightness) {
        try{
            Uri uri = android.provider.Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
            android.provider.Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness);
            // resolver.registerContentObserver(uri, true, myContentObserver);  activity.getContentResolver().notifyChange(uri, null);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

 

 

二、监听亮度变化

 

@Override
protected void onStart() {
    super.onStart();
    registerOberver();
    MLog.info(TAG, "onStart");
}

 

 

@Override
protected void onStop() {
    super.onStop();
    unregisterOberver();
    MLog.info(TAG, "onStop");
}

 

 

private final Uri BRIGHTNESS_MODE_URI =
            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
    private final Uri BRIGHTNESS_URI =
            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
    private final Uri BRIGHTNESS_ADJ_URI =
            Settings.System.getUriFor("screen_auto_brightness_adj");//Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ);  private boolean isRegistered = false;

    private void registerOberver() {
        try {
            if (BrightnessObserver != null) {
                if (!isRegistered) {
                    MLog.debug(TAG, "[ouyangyj] register BrightnessObserver");
                    final ContentResolver cr = getContentResolver();
                    cr.unregisterContentObserver(BrightnessObserver);
                    cr.registerContentObserver(BRIGHTNESS_MODE_URI, false, BrightnessObserver);
                    cr.registerContentObserver(BRIGHTNESS_URI, false, BrightnessObserver);
                    cr.registerContentObserver(BRIGHTNESS_ADJ_URI, false, BrightnessObserver);
                    isRegistered = true;
                }
            }
        } catch (Throwable throwable) {
            MLog.debug(TAG, "[ouyangyj] register BrightnessObserver error! " + throwable);
        }
    }

    private void unregisterOberver() {
        try {
            if (BrightnessObserver != null) {
                if (isRegistered) {
                    MLog.debug(TAG, "[ouyangyj] unregister BrightnessObserver");
                    getContentResolver().unregisterContentObserver(BrightnessObserver);
                    isRegistered = false;
                }
            }
        } catch (Throwable throwable) {
            MLog.debug(TAG, "[ouyangyj] unregister BrightnessObserver error! " + throwable);
        }
    }

    private ContentObserver BrightnessObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
           onChange(selfChange, null);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            super.onChange(selfChange);
            if (selfChange) return;
            MLog.debug(TAG, "[ouyangyj] BrightnessObserver onChange");
            if (BRIGHTNESS_MODE_URI.equals(uri)) {
                MLog.debug(this, "[ouyangyj] 亮度模式改变");
// updateBrightnessInfo();  } else if (BRIGHTNESS_URI.equals(uri) && !BrightnessUtils.isAutoBrightness(BasicChannelTemplateActivity.this)) {
                MLog.debug(this, "[ouyangyj] 亮度模式为手动模式 值改变");
// updateBrightnessInfo();  } else if (BRIGHTNESS_ADJ_URI.equals(uri) && BrightnessUtils.isAutoBrightness(BasicChannelTemplateActivity.this)) {
                MLog.debug(this, "[ouyangyj] 亮度模式为自动模式 值改变");
// updateBrightnessInfo();  } else {
                MLog.debug(this, "[ouyangyj] 亮度调整 其他");
// updateBrightnessInfo();  }
        }
    };

 

 

三、动态授权申请

对应异常

 

java.lang.SecurityException: balabalabala was not granted  this permission: android.permission.WRITE_SETTINGS.

    at android.os.Parcel.readException(Parcel.java:1602)

    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)

    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)

    at android.content.ContentProviderProxy.call(ContentProviderNative.java:646)

    at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:1325)

    at android.provider.Settings$System.putStringForUser(Settings.java:1678)

    at android.provider.Settings$System.putIntForUser(Settings.java:1783)

    at android.provider.Settings$System.putInt(Settings.java:1777)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值