文档章节

Android亮度调整解析

k
 kim366
发布于 2016/05/13 19:08
字数 946
阅读 52
收藏 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)

文档说明: 

Android6.0动态权限申请参考
貌似很多try catch, 因为真的可能抛异常......


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


本文转载自:http://blog.csdn.net/oyangyujun/article/details/51317124

k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
私信 提问
Android: Android Light Sensor HOWTO

基于android 2.2 添加Light Sensor支持: 1) UI部分 2) framework部分 3) HAL 部分 4) Driver 部分 下面分别讨论: 1) UI部分 a) 打开亮度设置菜单的自动调整亮度checkbox frameworks/base/co...

长平狐
2012/06/20
714
0
六个细节改变提升 Android L 用户体验

导语:美国科技博客Android Authority近期刊文称,谷歌在I/O开发者大会上发布了新版Android L系统,并公布了这一系统的新特性,包括对通知的重新设计、菜单的调整,以及Android for Work等。...

oschina
2014/07/07
4.5K
22
Android 2.3 再升级 提升 Nexus S 屏幕效果

在目前的市场中,Android系统无疑已经坐稳第二大智能平台的位置,同时随着不断更新升级,Android系统也愈加的完善,并为用户带来了更多 的功能与更好的体验。此前Android 2.3版本系统的登场曾...

红薯
2011/03/01
1K
3
Project Volta 让 Android 续航提升了多少?

似乎每一次 Android 大升级,Google 都习惯性地发布一个“Project”,以彰显对 Android 某一问题的改进力度。比如 Jelly Bean 的“Project Butter”(黄油计划)让 Android 系统的动画切换效...

oschina
2014/07/03
4.4K
13
Android UI换皮肤或 白天黑夜模式

> 白天夜间模式场景,换肤框架 -- 关于三种『应用内主题切换』开源项目的一点思考- https://www.jianshu.com/p/2164fa5803b9 1.Theme的方案,在style文件中定义不同的主题即可 2.遍历View,对...

desaco
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用QRCode.js生成二维码

什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 基本用法 <div id="qrcode"></div><scrip......

前端老手
13分钟前
5
0
spring-web 目录结构

ls /opt/pkg/spring-framework/spring-web/src/main/java/org/springframework/web/accept cors HttpMediaTypeNotSupportedException.java j......

MtrS
26分钟前
3
0
Qt编写自定义控件55-手机通讯录

一、前言 前面几篇文章中的控件基本上难度系数接近0,甚至有凑控件数量的嫌疑,这次必须来一个强悍的控件,本控件难度系数在所有控件中排前五,代码量也不少,头文件都550行,实现文件1600行...

飞扬青云
43分钟前
28
0
C++与QML交互2:在QML中调用C++特性

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/xi_gua_gua/article/details/56991367 QML引擎(QQmlEngin...

shzwork
今天
3
0
【Go专家编程】defer这里有个坑

前言 项目中,有时为了让程序更健壮,也即不panic,我们或许会使用recover()来接收异常并处理。 比如以下代码: func NoPanic() {if err := recover(); err != nil {fmt.Println("Recov...

恋恋美食
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部