效果


修改系统屏幕亮度这种操作还是挺常见的,一般在多媒体开发中都多少会涉及到。

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. Android(安卓)TV开发总结(五)TV上屏幕适配总结
  2. android修改软键盘的回车键为搜索键以及点击时执行两次监听事件
  3. Android的nodpi,xhdpi,hdpi,mdpi,ldpi
  4. Android.GridView事件监听
  5. Android中Home键的监听和拦截
  6. Android使用http协议与服务器通信
  7. Android多分辨率适配
  8. Android(安卓)获取屏幕尺寸与密度
  9. Android开发之接收系统广播消息

随机推荐

  1. Android(安卓)6.0运行时权限 (危险权限)
  2. android自定义大小对话框
  3. Android原生(Native)C开发之六:libpng移植
  4. Android+本地记事本(上)------实现登陆注
  5. Android(安卓)PinyinIME Debug 调试
  6. Android(安卓)MatrixCursor的详解
  7. adb shell 查看系统属性(用来判断特殊的操
  8. ListView中几个需要注意的属性
  9. Android高通平台下编译时能生成(拷贝)预
  10. Android(安卓)个推 Clientid,PushManagerR