Android 14,Jetpack Compose - 没有小狗请求位置权限,并且应用程序权限设置中缺失

问题描述 投票:0回答:1

在我的 Jetpack Compose 应用程序中,我有一个可组合助手来请求位置权限:

@Composable
fun GpsLocationHelper(hasLocationAccess: (Boolean)->Unit){

    val context = LocalContext.current
    val permissions = arrayOf(
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION
    )

    var hasLocationPermission by remember {
        mutableStateOf(
            permissions.all{
                ContextCompat.checkSelfPermission(
                context,
                it
            ) == PackageManager.PERMISSION_GRANTED}
        )
    }

    val launcher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestMultiplePermissions(),
        onResult = { permissionsMap ->
            hasLocationPermission = permissionsMap.values.reduce { acc, next ->
                acc && next
            }
            val locationEnabled = isLocationEnabled(context) //
            hasLocationAccess(hasLocationPermission && locationEnabled)
        }
    )

    LaunchedEffect(key1 = true) {
        launcher.launch(
            permissions
        )
    }
}

fun isLocationEnabled(context: Context): Boolean {
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    return LocationManagerCompat.isLocationEnabled(locationManager)
}

此外,我还有获取当前位置或开始获取位置更新的方法。

在需要 GPS 坐标的屏幕上,我这样称呼它:

GpsLocationHelper(hasLocationAccess = {
        if (it) {
            getCurrentLocation(context){lat, lng ->
                ....
            }
        }
    })

它适用于我测试过的旧版 Android 版本(9、11、12),但适用于 Android 14 我没有收到任何询问位置权限的弹出窗口,应用程序权限设置中也没有出现“位置”选项(见下图),因此

permissionsMap
始终包含 false 值。

My apps permission settings

在我的清单中,我进行了以下设置:

    <uses-feature android:name="android.hardware.location" />
    <uses-feature android:name="android.hardware.location.gps" />
    <uses-feature android:name="android.hardware.location.network" />
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

我已经了解到Android 14中有关位置权限的更改,但到目前为止我还没有找到可行的解决方案。

提前感谢您的帮助!

android permissions android-jetpack-compose location android-permissions
1个回答
0
投票

修改您的代码来处理此问题:

 val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
    arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION) // Request approximate location on Android 14+
} else {
    arrayOf(
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.