import 'dart:async'; import 'package:amap_flutter_location/amap_flutter_location.dart'; import 'package:amap_flutter_location/amap_location_option.dart'; import 'package:permission_handler/permission_handler.dart'; import 'amap/const_config.dart'; typedef AMAPListener = void Function(Map); void showPrivacy() { /// 设置是否已经包含高德隐私政策并弹窗展示显示用户查看,如果未包含或者没有弹窗展示,高德定位SDK将不会工作 /// /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy /// 必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意 /// /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy /// /// [hasContains] 隐私声明中是否包含高德隐私政策说明 /// /// [hasShow] 隐私权政策是否弹窗展示告知用户 AMapFlutterLocation.updatePrivacyShow(true, true); /// 设置是否已经取得用户同意,如果未取得用户同意,高德定位SDK将不会工作 /// /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy /// /// 必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意 /// /// [hasAgree] 隐私权政策是否已经取得用户同意 AMapFlutterLocation.updatePrivacyAgree(true); } // 判断定位权限 Future _requirePermission() async { print(1); // print(Permission.location); print(2); // print(Permission.locationAlways); print(3); PermissionStatus _permissionGranted = await Permission.location.status; if (_permissionGranted == PermissionStatus.denied) { // 如果未允许, 尝试申请一次 _permissionGranted = await Permission.location.request(); if (_permissionGranted != PermissionStatus.granted) { throw Exception("请设置允许当前程序定位功能"); } // if (await PermissionHelper.check(Permission.locationAlways)) { // // 这里写应用获取权限之后的业务逻辑 // } } } Future requireLocation(AMAPListener listener) async { AMapFlutterLocation.setApiKey( ConstConfig.amapApiKeys.androidKey!, ConstConfig.amapApiKeys.iosKey!); showPrivacy(); // await _requirePermission(); await checkPermission(); final AMapFlutterLocation location = AMapFlutterLocation(); location.onLocationChanged().listen(listener); location.setLocationOption(_getAMapLocationOption()); location.startLocation(); return location; } _getAMapLocationOption() { AMapLocationOption locationOption = new AMapLocationOption(); ///是否单次定位 locationOption.onceLocation = false; ///是否需要返回逆地理信息 locationOption.needAddress = true; ///逆地理信息的语言类型 locationOption.geoLanguage = GeoLanguage.DEFAULT; locationOption.desiredLocationAccuracyAuthorizationMode = AMapLocationAccuracyAuthorizationMode.ReduceAccuracy; locationOption.fullAccuracyPurposeKey = "AMapLocationScene"; ///设置Android端连续定位的定位间隔 locationOption.locationInterval = 2000; ///设置Android端的定位模式
///可选值:
///
  • [AMapLocationMode.Battery_Saving]
  • ///
  • [AMapLocationMode.Device_Sensors]
  • ///
  • [AMapLocationMode.Hight_Accuracy]
  • locationOption.locationMode = AMapLocationMode.Hight_Accuracy; ///设置iOS端的定位最小更新距离
    locationOption.distanceFilter = -1; ///设置iOS端期望的定位精度 /// 可选值:
    ///
  • [DesiredAccuracy.Best] 最高精度
  • ///
  • [DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度
  • ///
  • [DesiredAccuracy.NearestTenMeters] 10米
  • ///
  • [DesiredAccuracy.Kilometer] 1000米
  • ///
  • [DesiredAccuracy.ThreeKilometers] 3000米
  • locationOption.desiredAccuracy = DesiredAccuracy.Best; ///设置iOS端是否允许系统暂停定位 locationOption.pausesLocationUpdatesAutomatically = false; return locationOption; } // import 'dart:io'; // // import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart' // show BMFMapSDK, BMF_COORD_TYPE; // import 'package:flutter_bmflocation/flutter_bmflocation.dart'; // import 'package:permission_handler/permission_handler.dart'; // // Future requireLocation() async { // // 判断定位权限 // PermissionStatus _permissionGranted = await Permission.location.status; // if (_permissionGranted == PermissionStatus.denied) { // // 如果未允许, 尝试申请一次 // _permissionGranted = await Permission.location.request(); // if (_permissionGranted != PermissionStatus.granted) { // throw Exception("请设置允许当前程序定位功能"); // } // } // // final LocationFlutterPlugin location = LocationFlutterPlugin(); // // // 设置是否隐私政策 // location.setAgreePrivacy(true); // BMFMapSDK.setAgreePrivacy(true); // if (Platform.isAndroid) { // // Android 目前不支持接口设置Apikey, // // 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo // BMFMapSDK.setCoordType(BMF_COORD_TYPE.COMMON); // } // // return location; // } //判断是否有权限 Future checkPermission() async { Permission permission = Permission.locationAlways; PermissionStatus status = await permission.status; print('检测权限 $status'); if (status.isGranted) { //权限通过 } else if (status.isDenied) { //权限拒绝, 需要区分IOS和Android,二者不一样 requestPermission(permission); } else if (status.isPermanentlyDenied) { //权限永久拒绝,且不在提示,需要进入设置界面 openAppSettings(); } else if (status.isRestricted) { //活动限制(例如,设置了家长///控件,仅在iOS以上受支持。 openAppSettings(); } else { //第一次申请 requestPermission(permission); } } //申请权限 Future requestPermission(Permission permission) async { PermissionStatus status = await permission.request(); print('权限状态 $status'); if (!status.isGranted) { openAppSettings(); } }