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

Android Studio中使用Accompanist权限时Compose Preview异常

问题解决:Compose预览中使用Accompanist权限组件报错

问题原因

Compose预览的沙箱环境没有提供真实的Activity实例,而Accompanist权限库的rememberMultiplePermissionsState必须依赖Activity上下文才能初始化,所以预览时会抛出Permissions should be called in the context of an Activity异常。

解决办法

方法一:预览模式下使用模拟权限状态

通过LocalInspectionMode.current判断是否处于预览模式,预览时返回模拟的权限状态,避免初始化真实的权限组件:

@Composable
fun LocationPermissionScreen() {
    val isPreview = LocalInspectionMode.current
    val locationPermissionsState = if (isPreview) {
        // 模拟权限已授予的状态,可根据需要调整
        object : MultiplePermissionsState {
            override val permissions: List<PermissionState> = listOf(
                object : PermissionState {
                    override val permission: String = Manifest.permission.ACCESS_FINE_LOCATION
                    override val hasPermission: Boolean = true
                    override val shouldShowRationale: Boolean = false
                    override fun launchPermissionRequest() {}
                },
                object : PermissionState {
                    override val permission: String = Manifest.permission.ACCESS_COARSE_LOCATION
                    override val hasPermission: Boolean = true
                    override val shouldShowRationale: Boolean = false
                    override fun launchPermissionRequest() {}
                }
            )
            override val allPermissionsGranted: Boolean = true
            override fun launchMultiplePermissionRequest() {}
        }
    } else {
        rememberMultiplePermissionsState(
            listOf(
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION
            )
        )
    }

    // 后续UI逻辑
    if (locationPermissionsState.allPermissionsGranted) {
        Text("位置权限已授予")
    } else {
        Button(onClick = { locationPermissionsState.launchMultiplePermissionRequest() }) {
            Text("请求位置权限")
        }
    }
}

方法二:拆分组件,预览时显示占位UI

把权限相关逻辑封装到单独的Composable中,预览模式下只显示占位内容:

@Composable
fun PermissionWrapper() {
    val isPreview = LocalInspectionMode.current
    if (isPreview) {
        Text("预览模式:权限组件占位")
    } else {
        val locationPermissionsState = rememberMultiplePermissionsState(
            listOf(
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION
            )
        )
        PermissionContent(locationPermissionsState)
    }
}

@Composable
fun PermissionContent(permissionsState: MultiplePermissionsState) {
    // 这里编写权限相关的UI逻辑
    if (permissionsState.allPermissionsGranted) {
        Text("权限已就绪")
    } else {
        Button(onClick = permissionsState::launchMultiplePermissionRequest) {
            Text("申请权限")
        }
    }
}

内容的提问来源于stack exchange,提问作者Talha Akbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:50:30