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(ConstConfig.amapApiKeys.androidKey!, ConstConfig.amapApiKeys.iosKey!);
  41. showPrivacy();
  42. await _requirePermission();
  43. final AMapFlutterLocation location = AMapFlutterLocation();
  44. location.onLocationChanged().listen(listener);
  45. location.setLocationOption(_getAMapLocationOption());
  46. location.startLocation();
  47. return location;
  48. }
  49. _getAMapLocationOption() {
  50. AMapLocationOption locationOption = new AMapLocationOption();
  51. ///是否单次定位
  52. locationOption.onceLocation = false;
  53. ///是否需要返回逆地理信息
  54. locationOption.needAddress = true;
  55. ///逆地理信息的语言类型
  56. locationOption.geoLanguage = GeoLanguage.DEFAULT;
  57. locationOption.desiredLocationAccuracyAuthorizationMode =
  58. AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
  59. locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
  60. ///设置Android端连续定位的定位间隔
  61. locationOption.locationInterval = 2000;
  62. ///设置Android端的定位模式<br>
  63. ///可选值:<br>
  64. ///<li>[AMapLocationMode.Battery_Saving]</li>
  65. ///<li>[AMapLocationMode.Device_Sensors]</li>
  66. ///<li>[AMapLocationMode.Hight_Accuracy]</li>
  67. locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
  68. ///设置iOS端的定位最小更新距离<br>
  69. locationOption.distanceFilter = -1;
  70. ///设置iOS端期望的定位精度
  71. /// 可选值:<br>
  72. /// <li>[DesiredAccuracy.Best] 最高精度</li>
  73. /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
  74. /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
  75. /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
  76. /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
  77. locationOption.desiredAccuracy = DesiredAccuracy.Best;
  78. ///设置iOS端是否允许系统暂停定位
  79. locationOption.pausesLocationUpdatesAutomatically = false;
  80. return locationOption;
  81. }
  82. // import 'dart:io';
  83. //
  84. // import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'
  85. // show BMFMapSDK, BMF_COORD_TYPE;
  86. // import 'package:flutter_bmflocation/flutter_bmflocation.dart';
  87. // import 'package:permission_handler/permission_handler.dart';
  88. //
  89. // Future requireLocation() async {
  90. // // 判断定位权限
  91. // PermissionStatus _permissionGranted = await Permission.location.status;
  92. // if (_permissionGranted == PermissionStatus.denied) {
  93. // // 如果未允许, 尝试申请一次
  94. // _permissionGranted = await Permission.location.request();
  95. // if (_permissionGranted != PermissionStatus.granted) {
  96. // throw Exception("请设置允许当前程序定位功能");
  97. // }
  98. // }
  99. //
  100. // final LocationFlutterPlugin location = LocationFlutterPlugin();
  101. //
  102. // // 设置是否隐私政策
  103. // location.setAgreePrivacy(true);
  104. // BMFMapSDK.setAgreePrivacy(true);
  105. // if (Platform.isAndroid) {
  106. // // Android 目前不支持接口设置Apikey,
  107. // // 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
  108. // BMFMapSDK.setCoordType(BMF_COORD_TYPE.COMMON);
  109. // }
  110. //
  111. // return location;
  112. // }