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

Jetpack Compose:打开相机后刷新率被锁定在60Hz无法恢复

CameraX关闭后屏幕刷新率无法恢复90Hz的问题解决

问题核心原因

你遇到的问题本质是CameraX的LifecycleCameraController在Composable销毁后未正确释放相机关联的系统资源,导致系统仍维持相机预览时的60Hz刷新率配置,未自动恢复设备默认的90Hz。只有系统交互(下拉状态栏、切换应用等)触发窗口重新计算时,才会重置刷新率策略。

解决方案

1. 手动解绑相机生命周期并清理资源

在Composable中通过DisposableEffect监听组件销毁事件,手动解绑CameraController的生命周期并清理所有相机相关资源:

val lifecycleOwner = LocalLifecycleOwner.current
val context = LocalContext.current

val cameraController = remember {
    LifecycleCameraController(context).apply {
        cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
    }
}

// 监听Composable销毁,执行相机资源清理
DisposableEffect(lifecycleOwner, cameraController) {
    val lifecycleObserver = LifecycleEventObserver { _, event ->
        if (event == Lifecycle.Event.ON_DESTROY) {
            cameraController.unbind()
        }
    }
    lifecycleOwner.lifecycle.addObserver(lifecycleObserver)

    onDispose {
        lifecycleOwner.lifecycle.removeObserver(lifecycleObserver)
        // 彻底清理相机所有绑定的用例
        cameraController.clearPreview()
        cameraController.clearImageAnalysis()
        cameraController.clearVideoCapture()
        cameraController.unbind()
    }
}

AndroidView(
    modifier = Modifier.fillMaxSize(),
    factory = { ctx ->
        PreviewView(ctx).apply {
            setBackgroundColor(android.graphics.Color.BLACK)
            scaleType = PreviewView.ScaleType.FIT_CENTER
            controller = cameraController
        }
    },
    update = { previewView ->
        // 确保组件重组时controller绑定正确,销毁时可在此置空
        previewView.controller = cameraController
    }
)

2. 强制系统恢复高刷新率

如果解绑资源后仍未恢复,可手动请求系统将窗口刷新率重置为90Hz:

首先实现一个Context扩展函数获取当前Activity:

fun Context.findActivity(): Activity? {
    var currentContext = this
    while (currentContext is ContextWrapper) {
        if (currentContext is Activity) return currentContext
        currentContext = currentContext.baseContext
    }
    return null
}

然后在DisposableEffect的onDispose块中添加:

val activity = context.findActivity()
activity?.window?.let { window ->
    val layoutParams = window.attributes
    layoutParams.preferredRefreshRate = 90f
    window.attributes = layoutParams
    window.decorView.requestLayout()
}

3. 验证CameraX依赖配置

确保使用最新稳定版CameraX依赖(部分旧版本可能存在生命周期管理漏洞):

dependencies {
    def camerax_version = "1.3.0"
    implementation "androidx.camera:camera-core:$camerax_version"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    implementation "androidx.camera:camera-view:$camerax_version"
}

内容的提问来源于stack exchange,提问作者Damian Wędzikowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:22:47