android亮度调节功能开发思路整理(代码片段)

renhui renhui     2022-12-09     525

关键词:

在做Android音视频播放器开发的时候,我们基本都会遇到一类需求:音量 & 亮度 调节。其中做亮度调节功能的时候,发现还是有一定复杂度的。

Android亮度调节分为三个层次,分别是:

  • Android系统亮度调节
  • Android App亮度调节
  • Android当前屏幕(Window)亮度调节

一、Android系统亮度调节

Android系统亮度调节全局性最高,常见于系统设置中的亮度设置项。Android中提供了获取和设置系统亮度值的接口,具体如下:

// 获取系统亮度
Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
// 设置系统亮度
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);

其中,需要注意的是,返回的亮度值是处于0-255之间的整型数值。

Android 2.1以后的系统中,系统亮度调节中新增了“自动亮度”选项。“自动亮度”是依据外界光源来自动的改变系统亮度,目前大部分手机中对“自动亮度”还可以进行小幅度的调节其值。与自动亮度相对应的是“手动亮度”,当处于“手动亮度”下,设置拖动亮度进度条会大幅度的改变Android系统亮度。“手动亮度”和“自动亮度”分别称之为Android系统的“亮度模式”。

与之相对应的,Android系统中也提供了获取和设置“亮度模式”的接口。

// 获取系统亮度模式
Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
// 设置系统亮度模式
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, systemMode);

可是遗憾的是,Android中并未提供处于“自动亮度”模式下的亮度值接口。上面所说的获取系统亮度值接口实际上都是指“手动亮度”模式下的亮度值。

一般而言,通过手动亮度值以及设置系统亮度模式接口,可以满足常规的大部分针对Android系统亮度设置编码需求,以完成系统亮度调节。

二、Android App亮度调节

与系统亮度不同的是,Android中并未直接提供针对于App层面的亮度调节方式。因此,对于需要进行App的亮度调节,可以通过系统亮度调节或当前屏幕的亮度调节方式间接来实现。 

三、Android当前屏幕(Window)亮度调节

Android针对当前屏幕(Window)提供了设置亮度的接口,常见写法如下:

Window window = activity.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = brightness;
window.setAttributes(lp);

其中,需要注意的是此处的brightness是一个0.0-1.0之间的一个float类型数值。

默认情况下,当我们直接修改了系统亮度值后,当前Window中是可以即时反应出来亮度效果的,这是因为默认情况下,WindowManager.LayoutParams的screenBrightness的默认值为WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE。

即表示Window没有自己的亮度参数,将依随系统亮度效果的变化而变化。这也就是我们最常见的:当调整系统亮度后,所有Window都即时反应出系统亮度设置效果。

当时,实际项目中我们还会遇到此类需求:系统设置亮度时只针对当前Window或App内生效,而不影响到系统本身的亮度设置。

假设当前Window内有一个SeekBar,UI与系统亮度调节UI基本类似,用户可以滑动此SeekBar,使得当前Window亮度即时发生变化,且不影响到系统亮度效果。如何实现呢?

此时我们需要启用WindowManager.LayoutParams的screenBrightness参数,使之具有自动的特定亮度值,设置此值后在当前Window范围内,其将覆盖掉系统亮度设置。

因此,有必要将用户选择的亮度值转换为相应的Window亮度值(为与系统亮度值相一致,假设SeekBar的最大值为255)。

// 根据亮度值修改当前window亮度
public void changeAppBrightness(Context context, int brightness) 
     Window window = ((Activity) context).getWindow();
     WindowManager.LayoutParams lp = window.getAttributes();
     if (brightness == -1) 
         lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
      else 
         lp.screenBrightness = (brightness <= 0 ? 1 : brightness) / 255f;
     
     window.setAttributes(lp);

其中,brightness形参为用户选择的亮度值。

那么,上述代码中为什么有一个"brightness == -1"的判断呢?在此主要是考虑到App设置项中可能出现的“跟随系统亮度”或“恢复系统默认亮度”此类设置,当用户进行此类操作时,直接将screenBrightness参数还原成默认参数值即可。因为由前文描述“自动亮度”模式下系统亮度值是不能直接得到的,那么当系统处于“自动亮度”模式下,此时brightness参数值将无法准确确定,因此,将screenBrightness参数还原成默认参数值成为一个行之有效的方法。 

四、Android App亮度调节可行方案分析

目前网上有不少博文中提到App亮度调节时,提出的方案是在App设置项中,首先记录下设置之前的系统亮度值和亮度模式,用户在App设置项进行亮度调节时,直接修改系统亮度值,当用户退出此App,或App至于后台(如按下Home按键等),再将系统亮度还原。初看起来貌似一个可行的方案。但是主要存在如下几个问题:

1.如何获取到设置之前的系统亮度值和亮度模式(因为之后在此App外部要恢复系统亮度值到此初始值)?当用户每次进入到设置页时获取?严格意义上来说,是没法准确记录的。因为Android的用户操作不可预知性,如进入到设置页,拖动SeekBar设置了一个亮度值,此时直接修改了系统的亮度值,如果此时用户在未将应用至于后台或未将应用退出的情况下直接在App外部修改了系统亮度设置,如小米中可以通过下拉标题栏,直接就可以设置系统亮度。因此,App亮度设置之前的系统亮度初始值获取存在困难。

2.如何判断用户来到了App外部?因为此时需要恢复系统亮度设置到初始系统亮度。如用户可以按下Home按键,长按Home按键直接切换App,直接Back按键等一步步退出此App,下拉标题栏直接点击其他App通知信息进入到其他App,手机自动锁屏后解锁时用户直接进入其他应用等等,此类操作场景也具有不可预知性,因此,判断用户来到了App外部以恢复系统亮度到初始值的时机上也存在一定困难。

由此,App亮度调节方案推荐通过设置当前屏幕(Window)方式进行。

大致思路如下:

1. 用户在设置项中进行亮度调节时,调用changeAppBrightness()方法,将改变当前屏幕(Window)的亮度,此时对系统亮度无任何影响,接下来存在的问题终于要就集中于当用户来到本App其他Activity中,如果使得刚刚设置的亮度值得以即时反应出来。

2. 当用户进行亮度调节后,将当前亮度设置值保存起来(如保存到SharedPreferences中),在基类Activity中的onResume方法中,可以取出SharedPreferences中的用户所设置的App亮度值,然后changeAppBrightness()方法以实现每个当前屏幕的亮度调节。

 总体说来,通过设置当前屏幕(Window)的方式来设置App亮度更加简单有效。

 

和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯(代码片段)

目录1、PWM呼吸灯2、亮度可调节灯机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html 本篇博文中的项目之前使用Mind+编程软件已经实... 查看详情

和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯(代码片段)

目录1、PWM呼吸灯2、亮度可调节灯机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html 本篇博文中的项目之前使用Mind+编程软件已经实... 查看详情

和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯(代码片段)

目录1、PWM呼吸灯2、亮度可调节灯机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html 本篇博文中的项目之前使用Mind+编程软件已经实... 查看详情

android按键每次调节亮度时亮度框消失时间需要重新倒计时(代码片段)

...续显示且重新在后台计算。frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.javapubliclonginterceptKeyBeforeDispatching(IBinderfocusedToken,KeyEventevent,intpolicyFlags)elseif(keyCode==KeyEvent.KEYCODE_BRIGHTNESS_UP||keyCode==KeyEvent.KEYCODE_B... 查看详情

android按键锁屏时禁止按键调节亮度(代码片段)

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java在interceptKeyBeforeDispatching方法的亮度键的触发处:if(keyCode==KeyEvent.KEYCODE_BRIGHTNESS_UP||keyCode==KeyEvent.KEYCODE_BRIGHTNESS_DOWN)KeyguardManagerkeyguardManager=(Keyguard... 查看详情

android按键按键调节亮度,亮度条不是等比减少/增加的(代码片段)

frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java底层算法得出来的结果依次为:35657、45474…64269对应着十个亮度档,所以我按照这个规则进行二次计算和判断即可privatevoidupdateSlider(floatbrightnessValue,bo... 查看详情

android按键调节亮度结束后,让对话框自动消失(代码片段)

路径:frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java由于对话框是一个Activity,finish可以让界面销毁掉,再做个计时判断就可以了。@OverrideprotectedvoidonStart()super.onStart();mBrightnessController.registerCa... 查看详情

android按键调节亮度结束后,让对话框自动消失(代码片段)

路径:frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java由于对话框是一个Activity,finish可以让界面销毁掉,再做个计时判断就可以了。@OverrideprotectedvoidonStart()super.onStart();mBrightnessController.registerCa... 查看详情

javaandroid调节屏幕亮度(代码片段)

查看详情

android按键在视频播放器下,按键调节亮度与视频播放器图标ui不同步(代码片段)

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java在interceptKeyBeforeDispatching()播放视频时,拦截亮度事件++android.app.ActivityManageram=(android.app.ActivityManager)mContext.getSystemService(ACTIVITY_SERVICE);++android.conten... 查看详情

android10亮屏熄屏和自动调光(代码片段)

前言Android设备与用户进行交互往往通过屏幕进行,目前市场手机设备对于屏幕越来月看重,oled、高刷、大尺寸、全色域等都是各大厂商的pk项,目的都是为了提高设备的交互体验,同时现在大多数设备都已支持屏... 查看详情

java手势调节亮度(机器人)(代码片段)

查看详情

androidsystemui修复:先调节通知栏上的亮度条,再使用键盘增加亮度时会先减小亮度再增加(代码片段)

由于Android源码(AOSP)亮度算法只针对触摸设备进行计算,使用键盘的设备均会有不同的BUG,所以我打算如果用户下拉了状态栏,他只能滑动亮度条调节亮度,要想用按键调节亮度则需要把状态栏隐藏,... 查看详情

51单片机pwmled灯亮度调节+proteus仿真(代码片段)

51单片机PWMLED灯亮度调节+Proteus仿真Proteus仿真实例代码#include"reg51.h"unsignedintcd,dd;unsignedcharcc,ee;sbitLED=P2^ 查看详情

android11.0交换亮度键‘+’‘-’键的功能(代码片段)

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java在interceptKeyBeforeDispatching方法的亮度键的触发处:if(keyCode==KeyEvent.KEYCODE_BRIGHTNESS_UP||keyCode== 查看详情

android从头搭建视频播放器——概述(代码片段)

【Android】从头搭建视频播放器(1)——概述        转载请注明出处:http://blog.csdn.net/arnozhang12/article/details/48731443          近来有做播放器方面的需求,在搭建过程中,逐渐对Android上面视频播放器... 查看详情

2021数学建模国赛a题思路“fast”主动反射面的形状调节第一版思路思路开源已修订(代码片段)

原创开源思路下载链接,允许转卖链接:https://pan.baidu.com/s/13aSy2-hlkLa7Ps8wknYY1Q 提取码:gap4这里有百种算法出处整理,本题算法可从上面找取:给裸赛的家人们整理了百种算法出处https://mp.weixin.qq.com/s/OhWRCeep885M... 查看详情

小白自我提高学习设计模式笔记—装饰者模式在android开发的小试(代码片段)

目录前言一需要实现的功能1.功能描述   2.通常解决方案   (1)方案一: 全局一个 ActivityLifecycleCallbacks实现类   (2)方案二:每个功能一个ActivityLifecycleCallbacks实现类3.总结思考二装饰者模式应用1.... 查看详情