loacion_util.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. _locationPlugin.startLocation();
  37. if (value == PermissionStatus.granted) {
  38. _setLocationOption();
  39. _locationPlugin.startLocation();
  40. }
  41. });
  42. } else if (locationStatus.isGranted) {
  43. _setLocationOption();
  44. _locationPlugin.startLocation();
  45. }
  46. if (cameraStatus.isDenied) {
  47. await Permission.camera.request().then((value) {});
  48. }
  49. }
  50. void _setLocationOption() {
  51. AMapLocationOption locationOption = new AMapLocationOption();
  52. ///是否单次定位
  53. locationOption.onceLocation = true;
  54. ///是否需要返回逆地理信息
  55. locationOption.needAddress = true;
  56. ///逆地理信息的语言类型
  57. locationOption.geoLanguage = GeoLanguage.DEFAULT;
  58. locationOption.desiredLocationAccuracyAuthorizationMode =
  59. AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
  60. locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
  61. ///设置Android端连续定位的定位间隔
  62. locationOption.locationInterval = 2000;
  63. ///设置Android端的定位模式<br>
  64. ///可选值:<br>
  65. ///<li>[AMapLocationMode.Battery_Saving]</li>
  66. ///<li>[AMapLocationMode.Device_Sensors]</li>
  67. ///<li>[AMapLocationMode.Hight_Accuracy]</li>
  68. locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
  69. ///设置iOS端的定位最小更新距离<br>
  70. locationOption.distanceFilter = -1;
  71. ///设置iOS端期望的定位精度
  72. /// 可选值:<br>
  73. /// <li>[DesiredAccuracy.Best] 最高精度</li>
  74. /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
  75. /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
  76. /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
  77. /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
  78. locationOption.desiredAccuracy = DesiredAccuracy.Best;
  79. ///设置iOS端是否允许系统暂停定位
  80. locationOption.pausesLocationUpdatesAutomatically = false;
  81. ///将定位参数设置给定位插件
  82. _locationPlugin.setLocationOption(locationOption);
  83. }
  84. stopLocation() {
  85. ///移除定位监听
  86. if (null != _locationListener) {
  87. _locationListener?.cancel();
  88. }
  89. ///销毁定位
  90. _locationPlugin.destroy();
  91. }
  92. void requestAccuracyAuthorization() async {
  93. AMapAccuracyAuthorization currentAccuracyAuthorization =
  94. await _locationPlugin.getSystemAccuracyAuthorization();
  95. if (currentAccuracyAuthorization ==
  96. AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
  97. print("精确定位类型");
  98. } else if (currentAccuracyAuthorization ==
  99. AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
  100. print("模糊定位类型");
  101. } else {
  102. print("未知定位类型");
  103. }
  104. }
  105. }