You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose可组合组件中访问Window修改屏幕亮度?

在Composable组件中访问Window对象修改屏幕亮度

你可以通过以下几种方式在Composable里获取Window对象,进而修改屏幕亮度:

方法一:通过LocalContext获取Activity,再获取Window

在Composable中使用LocalContext拿到上下文,然后强转为ComponentActivity(或其子类),就能获取Window。注意要做空安全判断,避免Context不是Activity的情况:

@Composable
fun AdjustBrightness() {
    val context = LocalContext.current
    val window = (context as? ComponentActivity)?.window
    
    Button(onClick = {
        window?.let {
            it.attributes = it.attributes.apply {
                screenBrightness = 0.2f
            }
        }
    }) {
        Text("设置亮度为20%")
    }
}

方法二:自定义CompositionLocal提供Window

如果多个Composable都需要用到Window,更优雅的方式是在Activity中创建一个自定义的CompositionLocal,然后在Composable树中提供Window实例:

  1. 先定义CompositionLocal:
val LocalWindow = compositionLocalOf<Window?> { null }
  1. 在你的MainActivity的setContent中提供Window:
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            CompositionLocalProvider(LocalWindow provides window) {
                YourAppTheme {
                    // 你的Composable树
                    AdjustBrightness()
                }
            }
        }
    }
}
  1. 在Composable中直接获取使用:
@Composable
fun AdjustBrightness() {
    val window = LocalWindow.current
    
    Button(onClick = {
        window?.let {
            it.attributes = it.attributes.apply {
                screenBrightness = 0.2f
            }
        }
    }) {
        Text("设置亮度为20%")
    }
}

注意事项

  • 确保你的Context确实是Activity实例,比如在Dialog或其他非Activity上下文的Composable中,第一种方法会返回null,这时候要做相应的容错处理。
  • 修改屏幕亮度在Android 10及以上版本,非系统应用需要申请WRITE_SETTINGS权限,并且用户需要手动授权(可以通过Settings.ACTION_MANAGE_WRITE_SETTINGS引导用户打开权限页面)。

内容的提问来源于stack exchange,提问作者Basil the dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:57:07