loacion_util.dart 4.1 KB

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