location.dart 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import 'dart:async';
  2. import 'package:amap_flutter_location/amap_flutter_location.dart';
  3. import 'package:amap_flutter_location/amap_location_option.dart';
  4. import 'package:permission_handler/permission_handler.dart';
  5. import 'amap/const_config.dart';
  6. typedef AMAPListener = void Function(Map<String, Object>);
  7. void showPrivacy() {
  8. /// 设置是否已经包含高德隐私政策并弹窗展示显示用户查看,如果未包含或者没有弹窗展示,高德定位SDK将不会工作
  9. ///
  10. /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
  11. /// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
  12. ///
  13. /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
  14. ///
  15. /// [hasContains] 隐私声明中是否包含高德隐私政策说明
  16. ///
  17. /// [hasShow] 隐私权政策是否弹窗展示告知用户
  18. AMapFlutterLocation.updatePrivacyShow(true, true);
  19. /// 设置是否已经取得用户同意,如果未取得用户同意,高德定位SDK将不会工作
  20. ///
  21. /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
  22. ///
  23. /// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
  24. ///
  25. /// [hasAgree] 隐私权政策是否已经取得用户同意
  26. AMapFlutterLocation.updatePrivacyAgree(true);
  27. }
  28. // 判断定位权限
  29. Future _requirePermission() async {
  30. PermissionStatus _permissionGranted = await Permission.location.status;
  31. if (_permissionGranted == PermissionStatus.denied) {
  32. // 如果未允许, 尝试申请一次
  33. _permissionGranted = await Permission.location.request();
  34. if (_permissionGranted != PermissionStatus.granted) {
  35. throw Exception("请设置允许当前程序定位功能");
  36. }
  37. }
  38. }
  39. Future requireLocation(AMAPListener listener) async {
  40. AMapFlutterLocation.setApiKey(
  41. ConstConfig.amapApiKeys.androidKey!, ConstConfig.amapApiKeys.iosKey!);
  42. showPrivacy();
  43. await _requirePermission();
  44. final AMapFlutterLocation location = AMapFlutterLocation();
  45. location.onLocationChanged().listen(listener);
  46. location.setLocationOption(_getAMapLocationOption());
  47. location.startLocation();
  48. return location;
  49. }
  50. _getAMapLocationOption() {
  51. AMapLocationOption locationOption = new AMapLocationOption();
  52. ///是否单次定位
  53. locationOption.onceLocation = false;
  54. ///是否需要返回逆地理信息
  55. locationOption.needAddress = true;
  56. ///逆地理信息的语言类型
  57. locationOption.geoLanguage = GeoLanguage.DEFAULT;
  58. locationOption.desiredLocationAccuracyAuthorizationMode =
  59. AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
  60. locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
  61. ///设置Android端连续定位的定位间隔
  62. locationOption.locationInterval = 2000;
  63. ///设置Android端的定位模式<br>
  64. ///可选值:<br>
  65. ///<li>[AMapLocationMode.Battery_Saving]</li>
  66. ///<li>[AMapLocationMode.Device_Sensors]</li>
  67. ///<li>[AMapLocationMode.Hight_Accuracy]</li>
  68. locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
  69. ///设置iOS端的定位最小更新距离<br>
  70. locationOption.distanceFilter = -1;
  71. ///设置iOS端期望的定位精度
  72. /// 可选值:<br>
  73. /// <li>[DesiredAccuracy.Best] 最高精度</li>
  74. /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
  75. /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
  76. /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
  77. /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
  78. locationOption.desiredAccuracy = DesiredAccuracy.Best;
  79. ///设置iOS端是否允许系统暂停定位
  80. locationOption.pausesLocationUpdatesAutomatically = false;
  81. return locationOption;
  82. }
  83. // import 'dart:io';
  84. //
  85. // import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'
  86. // show BMFMapSDK, BMF_COORD_TYPE;
  87. // import 'package:flutter_bmflocation/flutter_bmflocation.dart';
  88. // import 'package:permission_handler/permission_handler.dart';
  89. //
  90. // Future requireLocation() async {
  91. // // 判断定位权限
  92. // PermissionStatus _permissionGranted = await Permission.location.status;
  93. // if (_permissionGranted == PermissionStatus.denied) {
  94. // // 如果未允许, 尝试申请一次
  95. // _permissionGranted = await Permission.location.request();
  96. // if (_permissionGranted != PermissionStatus.granted) {
  97. // throw Exception("请设置允许当前程序定位功能");
  98. // }
  99. // }
  100. //
  101. // final LocationFlutterPlugin location = LocationFlutterPlugin();
  102. //
  103. // // 设置是否隐私政策
  104. // location.setAgreePrivacy(true);
  105. // BMFMapSDK.setAgreePrivacy(true);
  106. // if (Platform.isAndroid) {
  107. // // Android 目前不支持接口设置Apikey,
  108. // // 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
  109. // BMFMapSDK.setCoordType(BMF_COORD_TYPE.COMMON);
  110. // }
  111. //
  112. // return location;
  113. // }