android 亮度广播,Android亮度调节的几种实现方法-程序员宅基地

技术标签: android 亮度广播  

最近在做一个App的设置项,亮度调节。真正做时,发现Android亮度调节比预想要复杂一些。其实目前网上已有不少这方面的资料,但有些博文具有一定误导性。在此将这块内容按照自己理解整理一下。

整体上看,Android亮度调节分为三个层次,分别是:Android系统亮度调节、Android App亮度调节和Android当前屏幕(Window)亮度调节。

1.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系统亮度设置编码需求,以完成系统亮度调节。

2.Android App亮度调节

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

3.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参数还原成默认参数值成为一个行之有效的方法。

4.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)方式进行。

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

智能推荐

深度学习 - 10.TF x Keras 基于 CNN 与 RNN 的文本序列 - 温度预测问题-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏31次。一.引言上一篇文章基础文本处理 processing && embedding介绍了常用的文本处理方法,趁热打铁了解一下处理连续文本的 demo 流程。二.数据信息与获取下面例子将用到气象记录站的天气时间序列,数据集中每10分钟记录14个不同的指标,包含气压,温度,湿度,风向等等环境相关的特征,这里采用 2009-2016 年的数据作为备选。1.源数据获取通过本地 terminal 输入如下命令,即可在对应 Downloads 文件夹下获取到原始数据。 ..

python获取视频帧率,总帧数,python ffmpeg获取视频信息ffmpeg.prob,python opencv获取视频信息cap.get(cv2.CAP_PROP_FRAME_WIDTH)-程序员宅基地

文章浏览阅读2.3w次,点赞9次,收藏59次。文章目录1,效果2,ffmpeg获取视频信息2,opencv获取视频信息1,效果2,ffmpeg获取视频信息其中key:‘streams’对应的值是一个list,list中有两个dict类型的值,分别表示视频中视频流和音频流的相关信息。key:‘format’对应的值是一个dict,其中包含了视频的相关的格式信息、视频时长信息、文件大小信息等。import ffmpegde..._cap.get(cv2.cap_prop_frame_width)

Bitmap.createBitmap java.lang.IllegalArgumentException: width and height must be > 0 问题解决-程序员宅基地

文章浏览阅读3.6k次。java.lang.IllegalArgumentException: width and height must be > 0 在postraotate之前需要设置转换矩形区域旋转时要判断旋转角度是否大于0,否则不做旋转。缺一报错Matrix mt = new Matrix(); float delta = angle - lastAngle;_java.lang.illegalargumentexception: width and height must be > 0

linux缺页异常处理--用户空间_linux 缺页异常 匿名-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏22次。用户空间的缺页异常可以分为两种情况--1.触发异常的线性地址处于用户空间的vma中,但还未分配物理页,如果访问权限OK的话内核就给进程分配相应的物理页了2.触发异常的线性地址不处于用户空间的vma中,这种情况得判断是不是因为用户进程的栈空间消耗完而触发的缺页异常,如果是的话则在用户空间对栈区域进行扩展,并且分配相应的物理页,如果不是则作为一次非法地址访问来处理,内核将终结进程下面来看d_linux 缺页异常 匿名

【MFC】多文档窗口实现现实多个不同的view窗口_mfc多文档生成多个子窗口-程序员宅基地

文章浏览阅读1.6k次。在InitInstance函数中添加多个文档模板m_pTemplateSchematicView = new CMultiDocTemplate(IDR_CTEMATYPE, RUNTIME_CLASS(CCTEMADoc), RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 RUNTIME_CLASS(CCTEMAView)); if (!m_pTemplateSchematicView) re..._mfc多文档生成多个子窗口

Python淘宝手机爬虫数据可视化分析大屏全屏系统 开题报告_基于python爬虫的淘宝手机可视化-程序员宅基地

文章浏览阅读562次,点赞22次,收藏23次。我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

随便推点

ROS2+NAV2如何快捷的在docker中使用主机的CAN_ros2 nav2 docker arm 部署-程序员宅基地

文章浏览阅读384次。2.基于镜像创建新容器:注意为了保证和旧容器其它配置全部一样,创建时,需要保留旧的配置和旧容器创建是一样(包括挂载的目录、关键变量等),然后修改或者增加自己需要加的改动。其中old_container_id为老的容器ID,new_image为镜像名,v1为标签。如果容器已经创建,忘记指定--network=host了,又不想删除老容器,想仍然用这个容器里面的各种配置,可以考虑创建一份这个容器的镜像,基于这个镜像,指定--network=host,创建新的容器。_ros2 nav2 docker arm 部署

# Android 设置PNG图片的 打印分辨率 dpi (pHYs)_phys dpi-程序员宅基地

文章浏览阅读3k次。Android 设置PNG图片的打印分辨率dpi(pHYs)1.了解png的原文件数据,头文件IHDR,控制物理密度的pHYs,关于png的头文件IHDR:https://blog.csdn.net/satanzw/article/details/38757121png图片都是以固定标识89 50 4E 47 0D 0A 1A 0A开始,然后接着IHDR例如一张png从头开始为:..._phys dpi

uniapp 解决app头部导航和手机顶部状态栏叠加问题及样式拼接写法_app顶部状态栏与头部重叠-程序员宅基地

文章浏览阅读3.8k次。app开发,手机顶部状态栏会和app头部导航叠加在一起解决方法:拿到顶部状态栏的高度,再给头部导航加个padding-top在app.vue里拿到状态栏的高度并存放在globalData里onLaunch() { const that = this; uni.getSystemInfo({ success(res) { that.globalData.statusBarHeight = res.statusBarHeight; } })},globalData:{ statu_app顶部状态栏与头部重叠

优雅的反转链表你知道吗-程序员宅基地

文章浏览阅读252次,点赞9次,收藏3次。重复将首节点的下一个节点调整到最前面,如链表1->2->3->4,调整过程为2->1->3->4,3->2->1->4,4->3->2->1。致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享。将原链表的元素从头到尾入栈后,从栈顶到栈底的元素的顺序即为原链表反转后的顺序。您的支持是我们为您提供帮助的最大动力。使链表从尾节点开始指向前一个节点。

Derby对应用开发的支持-程序员宅基地

文章浏览阅读138次。出处:blog.csdn.net 作者:eye_of_back 更新时间:2007-08-21 原文 一,derby是什么 Derby是什么,即使你说不上来,想必你也早就听说过了,当然了,如果没有听说过,也没有关系,因为下面就要和你说一下Derby。 Derby是一款轻量级的关系型数据库,它的出现要感谢的人很多,其中一位是IBM,它把Cloudscape源码开源,并捐献给了Ap..._derby插件版本一定要匹配吗

CapstoneCS5269Type-c转HDMI带PD3.0快充芯片_usb3.0转vga芯片-程序员宅基地

文章浏览阅读361次。CS5269: USB-C to HDMI 4K@60Hz + VGA + PD3.0 (No USB3.0)Type-C输出转换芯片,内含HDMI,VGA,PD3.0,能支持4k@60Hz分辨率,是目前业内集成度的一颗芯片,单芯片加较少的外围电路就能满足目前Docking市场的大多需求,创新点:1. 创新的发送器物理层设计,极大的减小了芯片面积2. DP的自适应均衡算法,可以适应各种不同衰减的cable。3. 创新的供电处理架构和算法,提供大的充电电流的同时保证了系统电源的稳定。4. 高精度度的ADC_usb3.0转vga芯片