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

Compose Multiplatform安卓端位置权限弹窗不显示问题求助

问题:Compose Multiplatform安卓端位置权限弹窗不弹出,高版本系统无权限选项

项目背景

我正在开发一套实时位置追踪系统,基于Compose Multiplatform。安卓端采用FusedLocationClient(结合GPS、Wifi、蓝牙提升定位精度),这套方案在原生Jetpack Compose项目中运行正常,无异常日志或报错。

核心代码模块包括:

  • 权限处理Composable(表现层)
  • LocationClient(核心定位逻辑层)
  • ViewModel(表现层逻辑)

核心代码

权限处理Composable(依赖Accompanist-permissions)

@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun LocationPermissionGate(
    content: @Composable () -> Unit
) {
    val permissionState = rememberPermissionState(
        ACCESS_FINE_LOCATION
    )

    LaunchedEffect(Unit) {
        permissionState.launchPermissionRequest()
    }

    when {
        permissionState.status.isGranted -> content()
        else -> Text("Location permission required")
    }
}

LocationClient实现

@Single(binds = [LocationClient::class])
class LocationClientImpl(
    private val fusedLocationClient : FusedLocationProviderClient
) : LocationClient{
    private lateinit var locationCallback : LocationCallback


    override fun requestLocationUpdates(interval : Long) = callbackFlow<Location> {


        val locationRequest = LocationRequest.Builder(
            Priority.PRIORITY_HIGH_ACCURACY,
            interval
        ).build()

        locationCallback = object : LocationCallback() {

            override fun onLocationResult(result: LocationResult) {
                result.lastLocation?.let { lastLocation ->
                    launch { send(lastLocation) }
                }
            }
        }

        fusedLocationClient.requestLocationUpdates(
            locationRequest,
            locationCallback,
            Looper.getMainLooper()
        )

        awaitClose {
            fusedLocationClient.removeLocationUpdates(locationCallback)
        }
    }
}

ViewModel代码

@KoinViewModel
class MainViewModel(
    private val locationClient : LocationClient
) : ViewModel() {

    private val _currentLocation = MutableStateFlow<Location?>(null)
    val currentLocation = _currentLocation.asStateFlow()

    fun startTrackingLocation() {
        viewModelScope.launch {

            locationClient.requestLocationUpdates(2000L).collect {
                _currentLocation.value = it
            }
        }
    }

    fun stopTrackingLocation(){
        viewModelScope.launch {
            locationClient.stopLocationUpdates()
            _currentLocation.value = null

        }
    }
}

权限清单配置

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

问题现象

迁移到Compose Multiplatform项目后,安卓端出现以下问题:

  • 位置权限弹窗始终不弹出,直接跳过用户选择步骤
  • 尝试无外部依赖的权限实现,断点显示权限返回均为false,系统仿佛自动拒绝请求
  • 系统设置中权限显示异常:
    • 原生Jetpack Compose应用在所有安卓版本均显示位置权限选项
    • Compose Multiplatform应用仅在Android 10中显示位置权限,更高版本无此选项

使用的版本信息

  • composeMultiplatform: 1.9.3
  • androidx-activity: 1.12.2
  • androidx-core: 1.17.0
  • androidx-lifecycle: 2.9.6
  • accompanistPermissions: 0.37.3
  • minSdk: 30
  • compileSdk: 36
  • targetSdk: 36

求各位帮忙分析问题根源并给出解决方案!


内容的提问来源于stack exchange,提问作者Matt M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 18:42:36