import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:amap_flutter_location/amap_flutter_location.dart'; import 'package:amap_flutter_location/amap_location_option.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:amap_flutter_map/amap_flutter_map.dart'; import 'package:amap_flutter_base/amap_flutter_base.dart'; import '../../../app_settings/app_colors.dart'; import '../../../main.dart'; class LockAddressGaoDePage extends StatefulWidget { const LockAddressGaoDePage({Key? key}) : super(key: key); @override State createState() => _LockAddressGaoDePageState(); } class _LockAddressGaoDePageState extends State{ // 高德地图 Map? _locationResult; StreamSubscription>? _locationListener; final AMapFlutterLocation _locationPlugin = AMapFlutterLocation(); late AMapController _mapController; static const CameraPosition _kInitialPosition = CameraPosition( target: LatLng(113.919112, 22.653728), zoom: 10.0, ); List get _approvalNumberWidget => []; @override void initState() { super.initState(); /// 设置是否已经包含高德隐私政策并弹窗展示显示用户查看,如果未包含或者没有弹窗展示,高德定位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); /// 动态申请定位权限 requestPermission(); ///设置Android和iOS的apiKey
///key的申请请参考高德开放平台官网说明
///Android: https://lbs.amap.com/api/android-location-sdk/guide/create-project/get-key ///iOS: https://lbs.amap.com/api/ios-location-sdk/guide/create-project/get-key AMapFlutterLocation.setApiKey("1dbf56e2e8a4d0e4cdc2df9efd36bc71", "dfb64c0463cb53927914364b5c09aba0"); ///iOS 获取native精度类型 if (Platform.isIOS) { requestAccuracyAuthorization(); } ///注册定位结果监听 _locationListener = _locationPlugin.onLocationChanged().listen((Map result) { setState(() { _locationResult = result; if (_locationResult != null) { _locationResult?.forEach((key, value) { print("key:$key value:$value"); }); } }); }); _startLocation(); } @override Widget build(BuildContext context) { ///使用默认属性创建一个地图 final AMapWidget map = AMapWidget( apiKey: const AMapApiKey(androidKey: '900f72eeee0f21e435cebb0ef155582a', iosKey: '4dfdec97b7bf0b8c13e94777103015a9'), onMapCreated: onMapCreated, // initialCameraPosition: _kInitialPosition ); return Stack( children: [ Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: map, ), Positioned( left: 10.w, bottom: 30.h, child: Container( alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: MainAxisAlignment.start, children: _approvalNumberWidget), ) ), Positioned( left: 20.w, right: 20.w, bottom: 100.h, child: Container( // height: h(106), decoration: BoxDecoration( color: AppColors.mainColor, borderRadius: BorderRadius.circular(15.w), ), child:Column( children: [ Container( // height: h(53), padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), child: Row( children: [ Image.asset('images/main/icon_addUserShowAddress.png', width: 30.w, height: 30.w), SizedBox(width: 10.w), Expanded( child: Text("广东省深圳市宏发科技园", style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip)) ), ], ), ), Container(height: 1.h, color: const Color(0xFF021732),), Container( // height: h(52), padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), child: Row( children: [ Image.asset('images/main/icon_addUserAddressShowTime.png', width: 30.w, height: 30.w), SizedBox(width: 10.w,), Expanded( child: Text("2023.8.22 15.14", style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500),) ), ], ), ), ], ) ),), ], ); } void onMapCreated(AMapController controller) { setState(() { _mapController = controller; getApprovalNumber(); }); } /// 获取审图号 void getApprovalNumber() async { //普通地图审图号 String? mapContentApprovalNumber = await _mapController.getMapContentApprovalNumber(); //卫星地图审图号 String? satelliteImageApprovalNumber = await _mapController.getSatelliteImageApprovalNumber(); setState(() { if (null != mapContentApprovalNumber) { _approvalNumberWidget.add(Text(mapContentApprovalNumber)); } if (null != satelliteImageApprovalNumber) { _approvalNumberWidget.add(Text(satelliteImageApprovalNumber)); } }); print('地图审图号(普通地图): $mapContentApprovalNumber'); print('地图审图号(卫星地图): $satelliteImageApprovalNumber'); } ///设置定位参数 void _setLocationOption() { 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; ///将定位参数设置给定位插件 _locationPlugin.setLocationOption(locationOption); } ///开始定位 void _startLocation() { ///开始定位之前设置定位参数 _setLocationOption(); _locationPlugin.startLocation(); } ///停止定位 void _stopLocation() { _locationPlugin.stopLocation(); } ///获取iOS native的accuracyAuthorization类型 void requestAccuracyAuthorization() async { AMapAccuracyAuthorization currentAccuracyAuthorization = await _locationPlugin.getSystemAccuracyAuthorization(); if (currentAccuracyAuthorization == AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) { print("精确定位类型"); } else if (currentAccuracyAuthorization == AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) { print("模糊定位类型"); } else { print("未知定位类型"); } } /// 动态申请定位权限 void requestPermission() async { // 申请权限 bool hasLocationPermission = await requestLocationPermission(); if (hasLocationPermission) { print("定位权限申请通过"); } else { print("定位权限申请不通过"); } } /// 申请定位权限 /// 授予定位权限返回true, 否则返回false Future requestLocationPermission() async { //获取当前的权限 var status = await Permission.location.status; if (status == PermissionStatus.granted) { //已经授权 return true; } else { //未授权则发起一次申请 status = await Permission.location.request(); if (status == PermissionStatus.granted) { return true; } else { return false; } } } // @override // void dispose() { // super.dispose(); // // _stopLocation(); // // ///移除定位监听 // if (null != _locationListener) { // _locationListener?.cancel(); // } // // ///销毁定位 // _locationPlugin.destroy(); // // print("高德地图定位销毁了"); // } @override void dispose() { super.dispose(); _stopLocation(); ///移除定位监听 if (null != _locationListener) { _locationListener?.cancel(); } ///销毁定位 _locationPlugin.destroy(); print("地图界面销毁了"); } }