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

获取设备位置权限被拒,点击按钮无位置信息显示问题求助

Flutter获取位置提示「Denied permissions to access the device's location」的解决方法

问题出在没有动态申请位置权限。Android 6.0(API 23)及以上系统中,位置权限属于危险权限,仅在Manifest里静态声明是不够的,必须在运行时主动向用户请求权限。

解决步骤:

  1. 修改位置获取方法,加入权限检查与请求逻辑
    替换你的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");
  }
}
  1. 确认Manifest权限配置(针对高版本Android)
    如果你的App targetSdkVersion 是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:45:40