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
相关产品推荐
相关产品推荐

