loacion_util.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. var locationStatus = await Permission.location.status;
  33. var cameraStatus = await Permission.camera.status;
  34. if (locationStatus.isDenied) {
  35. await Permission.location.request().then((value) async {
  36. if (value == PermissionStatus.granted) {
  37. _setLocationOption();
  38. _locationPlugin.startLocation();
  39. }
  40. });
  41. } else if (locationStatus.isGranted) {
  42. _setLocationOption();
  43. _locationPlugin.startLocation();
  44. }
  45. if (cameraStatus.isDenied) {
  46. await Permission.camera.request().then((value) {});
  47. }
  48. }
  49. void _setLocationOption() {
  50. AMapLocationOption locationOption = new AMapLocationOption();
  51. ///是否单次定位
  52. locationOption.onceLocation = true;
  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. ///将定位参数设置给定位插件
  81. _locationPlugin.setLocationOption(locationOption);
  82. }
  83. stopLocation() {
  84. ///移除定位监听
  85. if (null != _locationListener) {
  86. _locationListener?.cancel();
  87. }
  88. ///销毁定位
  89. _locationPlugin.destroy();
  90. }
  91. void requestAccuracyAuthorization() async {
  92. AMapAccuracyAuthorization currentAccuracyAuthorization =
  93. await _locationPlugin.getSystemAccuracyAuthorization();
  94. if (currentAccuracyAuthorization ==
  95. AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
  96. print("精确定位类型");
  97. } else if (currentAccuracyAuthorization ==
  98. AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
  99. print("模糊定位类型");
  100. } else {
  101. print("未知定位类型");
  102. }
  103. }
  104. }