在我的 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 值。
在我的清单中,我进行了以下设置:
<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中有关位置权限的更改,但到目前为止我还没有找到可行的解决方案。
提前感谢您的帮助!
修改您的代码来处理此问题:
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
)
}