Flutter 高德定位 permission_handler + amap_flutter_location 单例封装

贺季
2023-12-01
  1. 最近Flutter开发需要用到定位,使用高德定位(amap_flutter_location)。

    在pubspec.yaml 文件配置 

    dependencies:
      amap_flutter_location: ^2.0.0
  2. Android、Ios 申请高德地图key(这里不做多说,按照高德官方配置就行)
    集成高德定位Flutter插件-定位Flutter插件-开发指南-Flutter插件 | 高德地图API
     

  3. 注意点,Android 还需要在 build.gradle 文件添加
     

    dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        implementation('com.amap.api:location:5.2.0')
    }
  4. 结合permission_handler 单例封装(location_utils)

    import 'dart:async';
    
    import 'package:amap_flutter_location/amap_flutter_location.dart';
    import 'package:amap_flutter_location/amap_location_option.dart';
    import 'package:permission_handler/permission_handler.dart';
    
    
    class LocationUtils {
      LocationUtils._internal() {}
      static LocationUtils _locationUtils = LocationUtils._internal();
    
    
      Map<String, Object> _locationResult;
    
      StreamSubscription<Map<String, Object>> _locationListener;
    
      AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
    
      factory LocationUtils() {
        return _locationUtils;
      }
    
      ///初始化
       void init() {
        AMapFlutterLocation.setApiKey("androidkey", "ioskey");
        ///注册定位结果监听
        _locationListener = _locationPlugin.onLocationChanged().listen((Map<String, Object> result) {
            _locationResult = result;
        });
      }
    
    
      /// 动态申请定位权限
      void requestPermission() async {
        // 申请权限
        bool hasLocationPermission = await requestLocationPermission();
        if (hasLocationPermission) {
          _startLocation();
        } else {
    
        }
      }
    
    
      /// 申请定位权限
      /// 授予定位权限返回true, 否则返回false
      Future<bool> requestLocationPermission() async {
        //获取当前的权限
        var status = await Permission.location.status;
        if (status == PermissionStatus.granted) {
          //已经授权
          return true;
        } else {
          //未授权则发起一次申请
          status = await Permission.location.request();
          if (status == PermissionStatus.granted) {
            return true;
          } else {
            return false;
          }
        }
      }
    
    
      ///设置定位参数
      void _setLocationOption() {
        AMapLocationOption locationOption = new AMapLocationOption();
    
        ///是否单次定位
        locationOption.onceLocation = false;
    
        ///是否需要返回逆地理信息
        locationOption.needAddress = true;
    
        ///逆地理信息的语言类型
        locationOption.geoLanguage = GeoLanguage.DEFAULT;
    
        locationOption.desiredLocationAccuracyAuthorizationMode = AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
    
        locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
    
        ///设置Android端连续定位的定位间隔
        locationOption.locationInterval = 2000;
        ///设置Android端的定位模式<br>
        ///可选值:<br>
        ///<li>[AMapLocationMode.Battery_Saving]</li>
        ///<li>[AMapLocationMode.Device_Sensors]</li>
        ///<li>[AMapLocationMode.Hight_Accuracy]</li>
        locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
    
        ///设置iOS端的定位最小更新距离<br>
        locationOption.distanceFilter = -1;
    
        ///设置iOS端期望的定位精度
        /// 可选值:<br>
        /// <li>[DesiredAccuracy.Best] 最高精度</li>
        /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
        /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
        /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
        /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
        locationOption.desiredAccuracy = DesiredAccuracy.Best;
    
        ///设置iOS端是否允许系统暂停定位
        locationOption.pausesLocationUpdatesAutomatically = false;
    
        ///将定位参数设置给定位插件
        _locationPlugin.setLocationOption(locationOption);
      }
    
      ///开始定位
      void _startLocation() {
        ///开始定位之前设置定位参数
        _setLocationOption();
        _locationPlugin.startLocation();
      }
    
      ///停止定位
      void stopLocation() {
        _locationPlugin.stopLocation();
    
      }
      ///销毁定位
      void destroyLocation() {
        _locationPlugin.destroy();
      }
    
      Map<String, Object>  getlocationResult(){
        return _locationResult;
      }
    
    }
    

  5. 调用

     /// 定位初始化
     LocationUtils().init();
     /// 申请定位权限并开启定位
     LocationUtils().requestPermission();


     

 类似资料: