loacion_util.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:amap_flutter_location/amap_flutter_location.dart';
  4. import 'package:amap_flutter_location/amap_location_option.dart';
  5. import 'package:permission_handler/permission_handler.dart';
  6. import 'my_tools.dart';
  7. class LocationUtil {
  8. //私有构造函数
  9. LocationUtil._internal();
  10. //保存单例
  11. static LocationUtil _singleton = LocationUtil._internal();
  12. //工厂构造函数
  13. factory LocationUtil() => _singleton;
  14. AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
  15. Map<String, Object> _locationResult;
  16. StreamSubscription<Map<String, Object>> _locationListener;
  17. initLocation() {
  18. if (Platform.isIOS) {
  19. requestAccuracyAuthorization();
  20. }
  21. _locationListener = _locationPlugin
  22. .onLocationChanged()
  23. .listen((Map<String, Object> result) {
  24. result.forEach((key, value) {
  25. print('$key---------------$value');
  26. });
  27. getAddressByLatitudeAndLongitude(result['latitude'], result['longitude']);
  28. });
  29. }
  30. Future<void> getLocation() async {
  31. var locationStatus = await Permission.location.status;
  32. var cameraStatus = await Permission.camera.status;
  33. if (locationStatus.isDenied) {
  34. await Permission.location.request().then((value) async {
  35. if (value == PermissionStatus.granted) {
  36. _setLocationOption();
  37. _locationPlugin.startLocation();
  38. }
  39. });
  40. } else if (locationStatus.isGranted) {
  41. _setLocationOption();
  42. _locationPlugin.startLocation();
  43. }
  44. if (cameraStatus.isDenied) {
  45. await Permission.camera.request().then((value) {});
  46. }
  47. }
  48. void _setLocationOption() {
  49. AMapLocationOption locationOption = new AMapLocationOption();
  50. ///是否单次定位
  51. locationOption.onceLocation = true;
  52. ///是否需要返回逆地理信息
  53. locationOption.needAddress = true;
  54. ///逆地理信息的语言类型
  55. locationOption.geoLanguage = GeoLanguage.DEFAULT;
  56. locationOption.desiredLocationAccuracyAuthorizationMode =
  57. AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
  58. locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
  59. ///设置Android端连续定位的定位间隔
  60. locationOption.locationInterval = 2000;
  61. ///设置Android端的定位模式<br>
  62. ///可选值:<br>
  63. ///<li>[AMapLocationMode.Battery_Saving]</li>
  64. ///<li>[AMapLocationMode.Device_Sensors]</li>
  65. ///<li>[AMapLocationMode.Hight_Accuracy]</li>
  66. locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
  67. ///设置iOS端的定位最小更新距离<br>
  68. locationOption.distanceFilter = -1;
  69. ///设置iOS端期望的定位精度
  70. /// 可选值:<br>
  71. /// <li>[DesiredAccuracy.Best] 最高精度</li>
  72. /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
  73. /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
  74. /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
  75. /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
  76. locationOption.desiredAccuracy = DesiredAccuracy.Best;
  77. ///设置iOS端是否允许系统暂停定位
  78. locationOption.pausesLocationUpdatesAutomatically = false;
  79. ///将定位参数设置给定位插件
  80. _locationPlugin.setLocationOption(locationOption);
  81. }
  82. stopLocation() {
  83. ///移除定位监听
  84. if (null != _locationListener) {
  85. _locationListener?.cancel();
  86. }
  87. ///销毁定位
  88. _locationPlugin.destroy();
  89. }
  90. void requestAccuracyAuthorization() async {
  91. AMapAccuracyAuthorization currentAccuracyAuthorization =
  92. await _locationPlugin.getSystemAccuracyAuthorization();
  93. if (currentAccuracyAuthorization ==
  94. AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
  95. print("精确定位类型");
  96. } else if (currentAccuracyAuthorization ==
  97. AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
  98. print("模糊定位类型");
  99. } else {
  100. print("未知定位类型");
  101. }
  102. }
  103. }