location.dart 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. await checkPermission();
  53. final AMapFlutterLocation location = AMapFlutterLocation();
  54. location.onLocationChanged().listen(listener);
  55. location.setLocationOption(_getAMapLocationOption());
  56. location.startLocation();
  57. return location;
  58. }
  59. _getAMapLocationOption() {
  60. AMapLocationOption locationOption = new AMapLocationOption();
  61. ///是否单次定位
  62. locationOption.onceLocation = false;
  63. ///是否需要返回逆地理信息
  64. locationOption.needAddress = true;
  65. ///逆地理信息的语言类型
  66. locationOption.geoLanguage = GeoLanguage.DEFAULT;
  67. locationOption.desiredLocationAccuracyAuthorizationMode =
  68. AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
  69. locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
  70. ///设置Android端连续定位的定位间隔
  71. locationOption.locationInterval = 2000;
  72. ///设置Android端的定位模式<br>
  73. ///可选值:<br>
  74. ///<li>[AMapLocationMode.Battery_Saving]</li>
  75. ///<li>[AMapLocationMode.Device_Sensors]</li>
  76. ///<li>[AMapLocationMode.Hight_Accuracy]</li>
  77. locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
  78. ///设置iOS端的定位最小更新距离<br>
  79. locationOption.distanceFilter = -1;
  80. ///设置iOS端期望的定位精度
  81. /// 可选值:<br>
  82. /// <li>[DesiredAccuracy.Best] 最高精度</li>
  83. /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
  84. /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
  85. /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
  86. /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
  87. locationOption.desiredAccuracy = DesiredAccuracy.Best;
  88. ///设置iOS端是否允许系统暂停定位
  89. locationOption.pausesLocationUpdatesAutomatically = false;
  90. return locationOption;
  91. }
  92. // import 'dart:io';
  93. //
  94. // import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'
  95. // show BMFMapSDK, BMF_COORD_TYPE;
  96. // import 'package:flutter_bmflocation/flutter_bmflocation.dart';
  97. // import 'package:permission_handler/permission_handler.dart';
  98. //
  99. // Future requireLocation() async {
  100. // // 判断定位权限
  101. // PermissionStatus _permissionGranted = await Permission.location.status;
  102. // if (_permissionGranted == PermissionStatus.denied) {
  103. // // 如果未允许, 尝试申请一次
  104. // _permissionGranted = await Permission.location.request();
  105. // if (_permissionGranted != PermissionStatus.granted) {
  106. // throw Exception("请设置允许当前程序定位功能");
  107. // }
  108. // }
  109. //
  110. // final LocationFlutterPlugin location = LocationFlutterPlugin();
  111. //
  112. // // 设置是否隐私政策
  113. // location.setAgreePrivacy(true);
  114. // BMFMapSDK.setAgreePrivacy(true);
  115. // if (Platform.isAndroid) {
  116. // // Android 目前不支持接口设置Apikey,
  117. // // 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
  118. // BMFMapSDK.setCoordType(BMF_COORD_TYPE.COMMON);
  119. // }
  120. //
  121. // return location;
  122. // }
  123. //判断是否有权限
  124. Future checkPermission() async {
  125. Permission permission = Permission.locationAlways;
  126. PermissionStatus status = await permission.status;
  127. print('检测权限 $status');
  128. if (status.isGranted) {
  129. //权限通过
  130. } else if (status.isDenied) {
  131. //权限拒绝, 需要区分IOS和Android,二者不一样
  132. requestPermission(permission);
  133. } else if (status.isPermanentlyDenied) {
  134. //权限永久拒绝,且不在提示,需要进入设置界面
  135. openAppSettings();
  136. } else if (status.isRestricted) {
  137. //活动限制(例如,设置了家长///控件,仅在iOS以上受支持。
  138. openAppSettings();
  139. } else {
  140. //第一次申请
  141. requestPermission(permission);
  142. }
  143. }
  144. //申请权限
  145. Future requestPermission(Permission permission) async {
  146. PermissionStatus status = await permission.request();
  147. print('权限状态 $status');
  148. if (!status.isGranted) {
  149. openAppSettings();
  150. }
  151. }