获取设备位置权限被拒,点击按钮无位置信息显示问题求助
Flutter获取位置提示「Denied permissions to access the device's location」的解决方法
问题出在没有动态申请位置权限。Android 6.0(API 23)及以上系统中,位置权限属于危险权限,仅在Manifest里静态声明是不够的,必须在运行时主动向用户请求权限。
解决步骤:
- 修改位置获取方法,加入权限检查与请求逻辑
替换你的getCurrentLocation方法为以下代码,包含权限校验、请求及异常处理:
Position? position; List<Placemark>? placeMarks; getCurrentLocation() async { // 检查当前位置权限状态 LocationPermission permission = await Geolocator.checkPermission(); // 处理权限被拒绝的情况 if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { print("位置权限被拒绝,无法获取位置"); return; } } // 处理权限被永久拒绝的情况(用户勾选了"不再询问") if (permission == LocationPermission.deniedForever) { print("位置权限被永久拒绝,请前往应用设置开启"); await Geolocator.openAppSettings(); return; } // 权限通过后,安全获取位置信息 try { Position newPosition = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high, ); position = newPosition; placeMarks = await placemarkFromCoordinates( position!.latitude, position!.longitude, ); Placemark pMark = placeMarks![0]; String completeAddress = '${pMark.subThoroughfare} ${pMark.thoroughfare}, ' '${pMark.subLocality} ${pMark.locality}, ${pMark.subAdministrativeArea}, ' '${pMark.administrativeArea} ${pMark.postalCode}, ${pMark.country}'; location.text = completeAddress; } catch (e) { print("获取位置失败: $e"); } }
- 确认Manifest权限配置(针对高版本Android)
如果你的ApptargetSdkVersion是33及以上,除了已添加的权限,若需要后台定位功能,还需补充后台定位权限(仅在需要后台获取位置时添加):
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.market"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 10+ 后台定位权限(按需添加) --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>
关键说明:
- 必须先获取用户授权,才能调用
Geolocator.getCurrentPosition(),否则会直接抛出权限拒绝异常。 - 处理
deniedForever状态很重要,避免用户误操作后无法再次唤起权限请求,引导到设置页是最优解。
内容的提问来源于stack exchange,提问作者user19908504
相关产品推荐
相关产品推荐

