天天看點

Android 修改系統螢幕亮度及監聽效果操作拆解擷取系統螢幕亮度設定目前應用螢幕亮度,隻目前有效設定系統螢幕亮度,影響所有頁面和app監聽系統亮度變化Github

效果

Android 修改系統螢幕亮度及監聽效果操作拆解擷取系統螢幕亮度設定目前應用螢幕亮度,隻目前有效設定系統螢幕亮度,影響所有頁面和app監聽系統亮度變化Github

修改系統

螢幕亮度

這種操作還是挺常見的,一般在

多媒體

開發中都多少會涉及到。

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 {
                [email protected]?.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