Android亮度调整解析

来源:互联网 发布:广西专业技术人员网络 编辑:程序博客网 时间:2024/05/29 12:04

干货总结,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();        }    }}

二、监听亮度变化

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

@Overrideprotected 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)

文档说明: 
http://developer.android.com/reference/android/Manifest.permission.html

Android6.0动态权限申请参考
http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/

貌似很多try catch, 因为真的可能抛异常......


好了,下班了,客官慢走......把建议和意见留下......


0 0
原创粉丝点击