Flutter在Android 13上如何获取定位权限

我在Flutter开发的App中需要获取用户位置信息,但在Android 13系统上遇到权限问题。已经按照官方文档添加了ACCESS_FINE_LOCATION权限,但在运行时权限请求弹窗不显示。请问:

  1. Android 13是否需要额外配置新的定位权限?
  2. 在Flutter中应该如何正确处理Android 13的权限请求流程?
  3. 是否有针对API level 33的特殊适配要求?
  4. 测试发现onRequestPermissionsResult回调有时不触发,这是已知问题吗?
2 回复

在Flutter中获取Android 13定位权限,需先添加location依赖,然后在AndroidManifest.xml中声明权限。使用permission_handler包请求权限,调用requestPermission方法,处理用户授权结果。

更多关于Flutter在Android 13上如何获取定位权限的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Android 13 上,Flutter 获取定位权限需要适配新的权限模型,主要步骤如下:

1. 添加依赖

pubspec.yaml 中添加权限插件:

dependencies:
  permission_handler: ^11.0.0

2. 配置 Android 权限

android/app/src/main/AndroidManifest.xml 中添加权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 13 新增的精确位置权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

3. 请求权限代码

import 'package:permission_handler/permission_handler.dart';

// 检查并请求定位权限
Future<void> requestLocationPermission() async {
  // 检查当前权限状态
  var status = await Permission.location.status;
  
  if (status.isDenied) {
    // 请求权限
    status = await Permission.location.request();
    
    if (status.isGranted) {
      // 权限已授予
      print("定位权限已获取");
    } else if (status.isPermanentlyDenied) {
      // 权限被永久拒绝,需要引导用户到设置中开启
      openAppSettings();
    }
  }
}

4. 处理 Android 13 后台定位

如果需要后台定位,还需单独请求:

// 请求后台定位权限
if (await Permission.locationAlways.isGranted) {
  // 已授权后台定位
} else {
  await Permission.locationAlways.request();
}

注意事项:

  1. Android 13 将精确定位和模糊定位分离,需要明确声明用途
  2. AndroidManifest.xml 中建议添加权限说明:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
    android:maxSdkVersion="32" />

建议在应用启动时或使用定位功能前调用权限请求,并妥善处理用户拒绝的情况。

回到顶部