location.dart 5.3KB

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