Android 修改系统屏幕亮度及监听
效果
修改系统屏幕亮度
这种操作还是挺常见的,一般在多媒体
开发中都多少会涉及到。
emmm 效果图好像看不出来变化。。不过不是很重要。。
操作拆解
上图中可以看到,分别有加减按钮
和seekbar
来控制亮度。
后面会涉及到相关的事件。
获取系统屏幕亮度
/*** 获取系统屏幕亮度(0-255)*/private fun getScreenBrightness(): Int {try {return Settings.System.getInt(this.contentResolver, Settings.System.SCREEN_BRIGHTNESS)} catch (e: SettingNotFoundException) {e.printStackTrace()}return 0}
注意,这里的返回值是0-255
区间的。
定义两个参数:
- private var mScreenBrightness: Int = 0 //当前屏幕亮度
- private var ratio: Int = 25 //每次加减的比例
因为返回值最大是255,假设亮度调节是10档,每次加减1档大约是25,这个精度
可以自己控制。
设置当前应用屏幕亮度,只当前有效
加减按钮操作
btn_add.setOnClickListener {if (mScreenBrightness < (255 - ratio)) {mScreenBrightness += ratio} else {mScreenBrightness = 255}setWindowBrightness(mScreenBrightness)updateNum(mScreenBrightness)}btn_reduce.setOnClickListener {if (mScreenBrightness > ratio) {mScreenBrightness -= ratio} else {mScreenBrightness = 1}setWindowBrightness(mScreenBrightness)updateNum(mScreenBrightness)}
如果设置亮度的值大于255了,不会报错,但是会回到初始值
,所以加减操作的时候要判断一下最大值最小值。
接下来看一下核心方法setWindowBrightness
:
/*** 设置当前应用屏幕亮度,只当前有效*/private fun setWindowBrightness(brightness: Int) {val window = windowval lp = window.attributeslp.screenBrightness = brightness / 255.0fwindow.attributes = lp}
很简单,设置window
的属性即可。
这个只会对当前页面有效,返回页面或退到后台,屏幕亮度都会恢复
到初始值状态。
updateNum
方法是更新页面显示:
/*** 更新页面显示*/private fun updateNum(mScreenBrightness: Int) {//转float 取四舍五入val i: Int = (mScreenBrightness / (ratio.toFloat())).roundToInt()tv_brightness.text = i.toString()seekBar.progress = i}
其实到这里,已经能满足大部分的需求了。
Github: https://github.com/yechaoa/BrightnessAndVolume
设置系统屏幕亮度,影响所有页面和app
前面讲到的其实是单页面的亮度设置,也可以修改系统的屏幕亮度,即影响所有的页面和app,一般不会有这种操作。
这也涉及到一个高级
隐私权限,是否允许修改系统设置
,且需要在app设置页面手动授权
。
且需要先在manifest
中添加:
<!-- 修改系统屏幕亮度 --><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"tools:ignore="ProtectedPermissions" />
这里分几个小步骤:
- 判断权限
- 有则修改亮度
- 无则引导授权
seekBar操作
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {Log.i("onProgressChanged----", "" + progress)mScreenBrightness = progress * ratio//判断是否有修改系统设置权限if (Settings.System.canWrite(this@BrightnessActivity)) {setScreenBrightness(mScreenBrightness)updateNum(mScreenBrightness)} else {Toast.makeText(this@BrightnessActivity, "没有修改权限", Toast.LENGTH_SHORT).show()// 打开允许修改系统设置权限的页面val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:$packageName"))startActivityForResult(intent, mRequestCode)}}override fun onStartTrackingTouch(seekBar: SeekBar?) {}override fun onStopTrackingTouch(seekBar: SeekBar?) {}})
用Settings.System.canWrite
来判断是否已授权。
已授权
看setScreenBrightness
方法:
/*** 设置系统屏幕亮度,影响所有页面和app* 注意:这种方式是需要手动权限的(android.permission.WRITE_SETTINGS)*/private fun setScreenBrightness(brightness: Int) {try {//先检测调节模式setScreenManualMode()//再设置Settings.System.putInt(this.contentResolver, Settings.System.SCREEN_BRIGHTNESS, brightness)} catch (e: SettingNotFoundException) {e.printStackTrace()}}
我们看到在设置之前,还有一步操作是先检测调节模式
,因为如果当前亮度是自动调节的,需要改为手动才可以。
/*** 设置系统亮度调节模式(SCREEN_BRIGHTNESS_MODE)* SCREEN_BRIGHTNESS_MODE_MANUAL 手动调节* SCREEN_BRIGHTNESS_MODE_AUTOMATIC 自动调节*/private fun setScreenManualMode() {try {//获取当前系统亮度调节模式val mode = Settings.System.getInt(this.contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE)//如果是自动,则改为手动if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {Settings.System.putInt(this.contentResolver,Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL)}} catch (e: SettingNotFoundException) {e.printStackTrace()}}
亮度调节模式
- SCREEN_BRIGHTNESS_MODE_MANUAL 手动调节
- SCREEN_BRIGHTNESS_MODE_AUTOMATIC 自动调节
未授权
未授权的情况下,要提示并引导
用户去授权
Toast.makeText(this@BrightnessActivity, "没有修改权限", Toast.LENGTH_SHORT).show()// 打开允许修改系统设置权限的页面val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:$packageName"))startActivityForResult(intent, mRequestCode)
同时,检测返回结果并处理即可
/*** 处理返回结果*/override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == mRequestCode) {if (Settings.System.canWrite(this@BrightnessActivity)) {setScreenBrightness(mScreenBrightness)} else {Toast.makeText(this@BrightnessActivity, "拒绝了权限", Toast.LENGTH_SHORT).show()}}}
以上可以看到,不管是改模式还是改亮度,都是用的Settings.System.putInt
方法,也就是修改了系统的设置,从而达到所有页面和app使用同一亮度的需求。
监听系统亮度变化
以上两种方式其实都是我们手动去改的,那如果用户自己去改变了亮度呢,我们页面理应也要做出相应的改变,所以,还需要去监听系统的亮度变化。
这里也分几个小步骤:
- 注册监听
- 处理变化
- 注销监听
注册监听
/*** 注册监听 系统屏幕亮度变化*/private fun registerContentObserver() {this.contentResolver?.registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),true,mBrightnessObserver)}
处理变化
/*** 监听系统亮度变化*/private val mBrightnessObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {override fun onChange(selfChange: Boolean) {super.onChange(selfChange)try {this@BrightnessActivity.contentResolver?.let {mScreenBrightness = Settings.System.getInt(it, Settings.System.SCREEN_BRIGHTNESS)updateNum(mScreenBrightness)setWindowBrightness(mScreenBrightness)}} catch (e: SettingNotFoundException) {e.printStackTrace()}}}
注销监听
override fun onDestroy() {super.onDestroy()//注销监听this.contentResolver?.unregisterContentObserver(mBrightnessObserver)}
ok,至此关于修改屏幕亮度
的讲解就全部结束了,如果对你有用,就点个赞吧^ - ^
Github
https://github.com/yechaoa/BrightnessAndVolume
Android 修改系统屏幕亮度及监听相关推荐
- Android 修改系统屏幕亮度
[toc] Android系统的亮度值取值范围在0~255,数据类型是int型. 下面分两步介绍: 介绍关于系统亮度的一些常用的方法 结合一个案例说说 一.系统亮度常用的方法 1. 获得当前屏幕亮度的 ...
- android+系统屏幕亮度,android 设置系统屏幕亮度
android 设置系统屏幕亮度 权限 /** * 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHT ...
- android 系统亮度,android 设置系统屏幕亮度
android 设置系统屏幕亮度 权限 /** * 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHT ...
- Android修改默认屏幕亮度
本文基于Android5.1 1.修改默认屏幕亮度:\frameworks\base\packages\SettingsProvider\res\values\defaults.xml <!-- ...
- android软键盘回车键改成完成按钮,Android修改软键盘回车键并监听
首先在XML中修改想把回车键改变为什么键 android:imeOptions="actionSend" android:inputType="text" 其中 ...
- Android Screen Brightness 屏幕亮度 的获取和修改
Android Screen Brightness 屏幕亮度 的获取和修改 一.获取系统的屏幕亮度值 二.修改App屏幕亮度(仅当前应用) 三.修改系统屏幕亮度(所有应用) 一.获取系统的屏幕亮度值 ...
- Android之调节屏幕亮度
1.需求分析 在使用微信或者支付宝的付款码支付时,如果你点击放大付款码,就会跳转到一个新的页面去显示大尺寸的付款码,而且你会发现屏幕变亮了,这样会便于扫码机识别你的付款码.当你付款成功退出付款码放大的 ...
- android系统屏幕亮度调节
在$SDK/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中修改,PhoneWi ...
- android调节当前屏幕亮度的实现方式
我们平时使用的一些应用可能会有调节当前屏幕亮度却不改变系统亮度的功能,比如小说APP在阅读电子书时就拥有调节亮度的功能,但这个功能却在退出阅读模式后就失效了,这是怎么实现的? 以下就是调节当前屏幕亮度 ...
最新文章
- zset中的score_每天五分钟,成就redis大神之Zset数据类型
- ALEIDoc EDI(7)--IDoc Extension
- mysql配置-django
- noip2004普及组第2题 花生采摘
- CVPR 2020丨基于范例的精细可控图像翻译CoCosNet,一键生成你心目中的图像
- python之穿越火线游戏代码_Python 大作业之五子棋游戏(附代码)
- MyBatis的总结(下)
- python伪造邮件发件地址_Python:向多个地址发送电子邮件
- 并发 --- 32 管道 事件 信号量 进程池
- [转]C#用SHA对密码加密
- 计算机配件详情图解,电脑装机教程,详细教您怎么组装电脑
- 怎么用软件设计班旗_设计制作:班旗设计
- FieldII仿真之常用命令汇总
- python(输入)正常返回否则出错重新
- BZOJ 1189([HNOI2007]紧急疏散evacuate-网络流二分+拆点)
- [工作记事] Ubuntu 编译安装PHP以及gd库使得支持jepg
- IP广播无法登陆服务器系统,IP广播服务器软件(加密狗)SPR-03WJ
- [Vulhub] ThinkPHP漏洞合集
- 苹果计算机怎么开科学,苹果手机怎样设置科学计算器?
- matplotlib 中深色颜色选取