123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- 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<String, Object>);
-
- void showPrivacy() {
- /// 设置是否已经包含高德隐私政策并弹窗展示显示用户查看,如果未包含或者没有弹窗展示,高德定位SDK将不会工作
- ///
- /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
- /// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
- ///
- /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
- ///
- /// [hasContains] 隐私声明中是否包含高德隐私政策说明
- ///
- /// [hasShow] 隐私权政策是否弹窗展示告知用户
- AMapFlutterLocation.updatePrivacyShow(true, true);
-
- /// 设置是否已经取得用户同意,如果未取得用户同意,高德定位SDK将不会工作
- ///
- /// 高德SDK合规使用方案请参考官网地址:https://lbs.amap.com/news/sdkhgsy
- ///
- /// <b>必须保证在调用定位功能之前调用, 建议首次启动App时弹出《隐私政策》并取得用户同意</b>
- ///
- /// [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端的定位模式<br>
- ///可选值:<br>
- ///<li>[AMapLocationMode.Battery_Saving]</li>
- ///<li>[AMapLocationMode.Device_Sensors]</li>
- ///<li>[AMapLocationMode.Hight_Accuracy]</li>
- locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
-
- ///设置iOS端的定位最小更新距离<br>
- locationOption.distanceFilter = -1;
-
- ///设置iOS端期望的定位精度
- /// 可选值:<br>
- /// <li>[DesiredAccuracy.Best] 最高精度</li>
- /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
- /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
- /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
- /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
- 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();
- }
- }
|