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-255intervalであることに注意してください

2つのパラメータを定義します。

  • 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

システム画面の明るさを設定し、すべてのページとアプリに影響を与える

先ほど申し上げたのは、実際には1ページの明るさの設定ですが、システムの画面の明るさを変更することもできます。これは、すべてのページとアプリに影響します。このような操作は通常は不可能です。
これには、高级プライバシーの許可も含まれ、それがそうであるかどうかにかかわらず允许修改系统设置、アプリの設定ページにある必要があります手动授权

そして、最初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()
        }
    }

检测调节模式現在の明るさを自動調整する場合は手動に変更する必要があるため、設定する前にもう1つ操作が必要であることがわかります。

    /**
     * 设置系统亮度调节模式(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方法です。つまり、すべてのページとアプリで同じ明るさを使用するという要件を満たすようにシステム設定を変更します。

システムの明るさの変化を監視する

上記の2つの方法は実際には手動で変更されます。ユーザーが自分で明るさを変更する場合は、それに応じてページも変更する必要があります。したがって、システムの明るさの変化を監視する必要があります。

ここにはいくつかの小さなステップもあります。

  • 聞くために登録する
  • 変化に対処する
  • ログアウトモニター

聞くために登録する

    /**
     * 注册监听 系统屏幕亮度变化
     */
    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)
    }

わかりました、これまでのところ修改屏幕亮度、それについての説明はすべて終わりました、それがあなたにとって有用であるならば、それと同じように^-^

Github

https://github.com/yechaoa/BrightnessAndVolume

おすすめ

転載: blog.csdn.net/yechaoa/article/details/112196271