效果

Android 修改系统屏幕亮度及监听_第1张图片
修改系统屏幕亮度这种操作还是挺常见的,一般在多媒体开发中都多少会涉及到。

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 = window        val lp = window.attributes        lp.screenBrightness = brightness / 255.0f        window.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-permission        android: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

更多相关文章

  1. 为什么要在 Windows 10 系统上运行 Android 应用程序?
  2. Android系统架构解析
  3. Google工程师解析Android系统架构
  4. Android灭亡论之Firefox OS操作系统出现
  5. Android调用系统相机和图库
  6. Android TV开发总结(五)TV上屏幕适配总结

随机推荐

  1. 关于Android的开发经验总结
  2. Android RelativeLayout 相对布局解析
  3. Android的Window类
  4. Android 电池管理系统
  5. Android(安卓)跨进程启动Activity黑屏(白
  6. Android教程之一:Window下搭建Android开发
  7. Android的一点思考
  8. 《浅谈android进程》
  9. android原生和H5交互(转)
  10. Android Q正式版发布时间确定!详细介绍内