草庐IT

Android集成高德Flutter地图(三)定位

文阿花 2024-04-09 原文

一、集成高德地图

我的项目是需要显示地图的,所以定位是在地图的基础上实现的,当然定位也可以单独实现,获取到位置相关各种信息

二、集成高德定位

①、集成定位基础SDK
在Flutter项目中Android文件夹下的build.gradle添加

implementation('com.amap.api:location:6.1.0')

注意兼容性处理

我这里集成的是Flutter3.0插件
所以配置build.gradle为:

dependencies {
    //高德地图Flutter插件内不包含基础SDK包,使用时请参考官网关于集成Android地图SDK和iOS地图SDK说明配置地图SDK
   // 高德地图Flutter插件3.0.0版本基于地图SDK8.1.0开发,适配高德地图SDK版本8.1.0及以上版本
    //高德定位Flutter插件3.0.0版本基于Android定位5.6.0和iOS定位2.8.0版本开发,适配Android定位5.6.0和iOS定位2.8.0及以上版本
//    implementation('com.amap.api:map2d:6.0.0')
    implementation('com.amap.api:3dmap:9.2.1')
    implementation('com.amap.api:location:6.1.0')
}

这里注意有可能会冲突:
文档生成日期的 定位location最新版本是6.1.0 ,3dmap的最新版本9.4.0,经测试发现location使用6.1.0,3dmap使用9.2.1以上版本时(不包括9.2.1)编译会报错:

Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class com.amap.api.fence.DistrictItem found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.DistrictItem$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.GeoFence found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.GeoFence$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.GeoFenceClient found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.GeoFenceListener found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.PoiItem found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.fence.PoiItem$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocation found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocation$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClient found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption$2 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption$AMapLocationMode found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption$AMapLocationProtocol found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption$AMapLocationPurpose found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationClientOption$GeoLanguage found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationListener found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.AMapLocationQualityReport found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.APSService found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.CoordUtil found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.CoordinateConverter found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.CoordinateConverter$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.CoordinateConverter$CoordType found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.DPoint found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.DPoint$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.UmidtokenInfo found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.UmidtokenInfo$1 found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
     Duplicate class com.amap.api.location.UmidtokenInfo$a found in modules jetified-3dmap-9.4.0 (com.amap.api:3dmap:9.4.0) and jetified-location-6.1.0 (com.amap.api:location:6.1.0)
  • 解决办法:
    将3dmap使用8.1.0–9.2.1版本

②、定位权限动态申请

记得处理6.0以上系统的动态申请定位权限:
我这里使用插件:

```dart
permission_handler: 10.0.1
requestPermiss() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.location,
      // Permission.storage,
      // Permission.camera,
    ].request();
    //验证权限是否授权
    var status = await Permission.location.status;

    if (status == PermissionStatus.granted) {
      LogUtil.d('定位权限:true');
      //已经授权
    } else {
      LogUtil.d('定位权限:false');
      //退出应用
      Future.value(true);
    }
  }

③、高德定位文档里面需要首先设置权限和key代码如下:

 StreamSubscription<Map<String, Object>>? _locationListener;

  AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
 

 
  void initState() {
    super.initState();
    initLocation();
  }
/*地

图定位*/
  void initLocation() {
    //高德定位
     AMapFlutterLocation.updatePrivacyShow(true, true);
     AMapFlutterLocation.updatePrivacyAgree(true);
    AMapFlutterLocation.setApiKey(
        "8c278373b54c9c393c74f1d1a2d31d49", "ios ApiKey");
    ///iOS 获取native精度类型
    if (Platform.isIOS) {
      requestAccuracyAuthorization();
    }
    ///注册定位结果监听
    _locationListener = _locationPlugin
        .onLocationChanged()
        .listen((Map<String, Object> result) {
      setState(() {
        _locationResult = result;
        LogUtils.e("高德定位==========="+result.toString());
        LogUtils.e("高德定位latitude==========="+result['latitude'].toString());
        LogUtils.e("高德定位longitude: ==========="+result['longitude'].toString());
        LogUtils.e("高德定位country: ==========="+result['country'].toString());
        LogUtils.e("高德定位province: ==========="+result['province'].toString());
        LogUtils.e("高德定位city: ==========="+result['city'].toString());
        LogUtils.e("高德定位city: ==========="+result['city'].toString());
        LogUtils.e("高德定位district: ==========="+result['district'].toString());
        LogUtils.e("高德定位adCode: ==========="+result['adCode'].toString());
      });
    });
    _setLocationOption();
  }

设置定位参数_setLocationOption()

///设置定位参数
  void _setLocationOption() {
    if (null != _locationPlugin) {
      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;

      ///将定位参数设置给定位插件
      _locationPlugin.setLocationOption(locationOption);

      ///开始定位
      _startLocation();
    }
  }

ios配置requestAccuracyAuthorization()

  ///获取iOS native的accuracyAuthorization类型
  void requestAccuracyAuthorization() async {
    AMapAccuracyAuthorization currentAccuracyAuthorization =
    await _locationPlugin.getSystemAccuracyAuthorization();
    if (currentAccuracyAuthorization ==
        AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
      print("精确定位类型");
    } else if (currentAccuracyAuthorization ==
        AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
      print("模糊定位类型");
    } else {
      print("未知定位类型");
    }
  }

开始定位_startLocation()

 ///开始定位
  void _startLocation() {
    if (null != _locationPlugin) {
      _locationPlugin.startLocation();
    }
  }

  ///停止定位
  void _stopLocation() {
    if (null != _locationPlugin) {
      _locationPlugin.stopLocation();
    }
  }

页面销毁时移除处理

 
  void dispose() {
    super.dispose();
    ///移除定位监听
    if (null != _locationListener) {
      _locationListener!.cancel();
    }
    ///销毁定位
    if (null != _locationPlugin) {
      _locationPlugin.destroy();
    }
  }

结果打印:

高德定位==========={callbackTime: 2022-10-10 16:45:06, locationTime: 2022-10-10 16:44:39, locationType: 4, latitude: 34.791413, longitude: 113.80804, accuracy: 73.0, altitude: 0.0, bearing: 0.0, speed: 0.0, country: 中国, province: 河南省, city: 郑州市, district: 金水区, street: 中道东路, streetNumber: 195, cityCode: 0371, adCode: 410105, address: 河南省郑州市金水区中道东路195号靠近正商博雅广场, description: 在正商博雅广场附近}
I/flutter ( 6925): Flutter_Gas_Client | 高德定位latitude===========34.791413
I/flutter ( 6925): Flutter_Gas_Client | 高德定位longitude: ===========113.80804
I/flutter ( 6925): Flutter_Gas_Client | 高德定位country: ===========中国
I/flutter ( 6925): Flutter_Gas_Client | 高德定位province: ===========河南省
I/flutter ( 6925): Flutter_Gas_Client | 高德定位city: ===========郑州市
I/flutter ( 6925): Flutter_Gas_Client | 高德定位city: ===========郑州市
I/flutter ( 6925): Flutter_Gas_Client | 高德定位district: ===========金水区
I/flutter ( 6925): Flutter_Gas_Client | 高德定位adCode: ===========410105

④、在地图上显示自己的位置

  MyLocationStyleOptions _myLocationStyleOptions =
  MyLocationStyleOptions(true);
final AMapWidget map = AMapWidget(
      privacyStatement: ConstConfig.amapPrivacyStatement,
      apiKey: ConstConfig.amapApiKeys,
      //地图样式  默认普通地图 普通视图 normal,卫星视图 satellite, 夜间视图 night, 导航视图 navi, 公交视图 bus,
      mapType: MapType.normal,
      //是否显示3D地图
      buildingsEnabled: true,
      //设置地图默认中心点
      // initialCameraPosition:
      //     CameraPosition(target: LatLng(34.76, 113.78), zoom: 10),
      //是否显示指南针
      compassEnabled: true,
      //比例尺是否显示
      scaleEnabled: true,
      //是否显示路况信息
      trafficEnabled: false,
      //是否显示底图文字
      labelsEnabled: true,
      //旋转手势
      rotateGesturesEnabled: true,
      //滑动手势
      scrollGesturesEnabled: true,
      //倾斜手势
      tiltGesturesEnabled: true,
      //缩放手势
      zoomGesturesEnabled: true,
      //地图创建完成回调,成功后会返回AMapController对象
      onMapCreated: onMapCreated,
      //地图移动回调
      onCameraMove: _onCameraMove,
      // //创建地图时,给marker属性赋值一个空的set,否则后续无法添加marker
      markers: Set<Marker>.of(_markers.values),
      //当前位置显示
      myLocationStyleOptions: _myLocationStyleOptions/*MyLocationStyleOptions(
        true,
        circleFillColor: Colors.lightBlue,
        circleStrokeColor: Colors.blue,
        circleStrokeWidth: 1,
      ),*/
    );

显示效果:

④.1 定位显示范围:需要放大后一定比例后才显示
MyLocationStyleOptions(
        true,
        circleFillColor: Colors.lightBlue,
        circleStrokeColor: Colors.blue,
        circleStrokeWidth: 1,
      )

显示效果:

④.2 自定义定位图标
 myLocationStyleOptions: MyLocationStyleOptions(
        true,
        icon:BitmapDescriptor.fromIconPath('image/icon_del.png')
      ),

显示效果:

三、地图+定位完整界面代码如下:

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:amap_flutter_location/amap_location_option.dart';
import 'package:amap_flutter_map/amap_flutter_map.dart';
import 'package:common_utils/common_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:amap_flutter_base/amap_flutter_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:frametrim/map/MapImageUtil.dart';
import 'package:frametrim/utility/log_utils.dart';
import '../../map/const_config.dart';
import 'package:amap_flutter_location/amap_flutter_location.dart';

/*政府端
* 实时监控*/
class GovernmentMonitorPage extends StatefulWidget {
  
  State<StatefulWidget> createState() => GovernmentMonitorState();
}

class GovernmentMonitorState extends State<GovernmentMonitorPage> {
  AMapController? _mapController;

  //需要先设置一个空的map赋值给AMapWidget的markers,否则后续无法添加marker
  final Map<String, Marker> _markers = <String, Marker>{};
  late List<LatLng> makLocations = [
    LatLng(34.80, 113.66), //金水
    LatLng(34.72, 113.64), //二七
    LatLng(34.75, 113.68), //管城
    LatLng(34.75, 113.61), //中原
    LatLng(34.87, 113.62) //惠济
  ];
  late List<String> makerText = ['金水区150', '二七区25', '管城区100', '中原区32', '惠济56'];


  Map<String, Object>? _locationResult;

  StreamSubscription<Map<String, Object>>? _locationListener;

  AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();


  ///自定义定位小蓝点
  MyLocationStyleOptions _myLocationStyleOptions =
  MyLocationStyleOptions(true);

  
  void initState() {
    super.initState();
    initLocation();
  }

  
  Widget build(BuildContext context) {
    ///使用默认属性创建一个地图
    final AMapWidget map = AMapWidget(
      privacyStatement: ConstConfig.amapPrivacyStatement,
      apiKey: ConstConfig.amapApiKeys,
      //地图样式  默认普通地图 普通视图 normal,卫星视图 satellite, 夜间视图 night, 导航视图 navi, 公交视图 bus,
      mapType: MapType.normal,
      //是否显示3D地图
      buildingsEnabled: true,
      //设置地图默认中心点
      // initialCameraPosition:
      //     CameraPosition(target: LatLng(34.76, 113.78), zoom: 10),
      //是否显示指南针
      compassEnabled: true,
      //比例尺是否显示
      scaleEnabled: true,
      //是否显示路况信息
      trafficEnabled: false,
      //是否显示底图文字
      labelsEnabled: true,
      //旋转手势
      rotateGesturesEnabled: true,
      //滑动手势
      scrollGesturesEnabled: true,
      //倾斜手势
      tiltGesturesEnabled: true,
      //缩放手势
      zoomGesturesEnabled: true,
      //地图创建完成回调,成功后会返回AMapController对象
      onMapCreated: onMapCreated,
      //地图移动回调
      onCameraMove: _onCameraMove,
      // //创建地图时,给marker属性赋值一个空的set,否则后续无法添加marker
      markers: Set<Marker>.of(_markers.values),
      myLocationStyleOptions: /*_myLocationStyleOptions*/MyLocationStyleOptions(
        true,
        icon:BitmapDescriptor.fromIconPath('image/icon_del.png')
      ),
    );

    return Scaffold(
      body: AnnotatedRegion(
        value: SystemUiOverlayStyle.dark,
        child: Container(
          height: MediaQuery
              .of(context)
              .size
              .height,
          width: MediaQuery
              .of(context)
              .size
              .width,
          // child: Text('11'),
          child: map,
        ),
      ),
    );
  }

  void onMapCreated(AMapController controller) {
    setState(() {
      _mapController = controller;
      getApprovalNumber();
      _changeCameraPosition();
      _changeZoom();
      for (int i = 0; i < makLocations.length; i++) {
        _addAreaMarker(makLocations[i], i);
      }
    });
  }

  //地图移动回调
  void _onCameraMove(CameraPosition cameraPosition) {
    if (null == cameraPosition) {
      return;
    }
    print('onCameraMove===> ${cameraPosition.toMap()}');
  }

  // 获取审图号
  void getApprovalNumber() async {
    //普通地图审图号
    String? mapContentApprovalNumber =
    await _mapController?.getMapContentApprovalNumber();
    //卫星地图审图号
    String? satelliteImageApprovalNumber =
    await _mapController?.getSatelliteImageApprovalNumber();
  }

  //改变地图中心点
  void _changeCameraPosition() {
    _mapController?.moveCamera(
      CameraUpdate.newCameraPosition(
        CameraPosition(
          //中心点
            target: LatLng(34.80, 113.66),
            //缩放级别
            zoom: 13,
            //俯仰角0°~45°(垂直与地图时为0)
            tilt: 30,
            //偏航角 0~360° (正北方为0)
            bearing: 0),
      ),
      animated: true,
    );
  }

  //缩放地图级别
  void _changeZoom() {
    CameraUpdate.zoomTo(18);
  }

  ///添加一个区域marker
  Future<void> _addAreaMarker(LatLng mLatLng, int index) async {
    final _markerPosition = mLatLng;
    Widget widget = await buildAreaMarkWidget(index);
    Uint8List? bd = await MapImageUtil.convertWidgetToImage(widget);
    final Marker marker = Marker(
        position: _markerPosition,
        //使用默认hue的方式设置Marker的图标
        icon: BitmapDescriptor.fromBytes(bd!),
        // icon:  BitmapDescriptor.fromIconPath('image/distract_bg.png')
        onTap: (id) {
          LogUtil.d('点击Marker$id');
          setState(() {
            _markers.clear();
            for (int i = 0; i < makLocations.length; i++) {
              _addPointMarker(makLocations[i], i);
            }
          });
        });
    //调用setState触发AMapWidget的更新,从而完成marker的添加
    setState(() {
      //将新的marker添加到map里
      _markers[marker.id] = marker;
    });
  }

  ///添加一个点marker-点
  Future<void> _addPointMarker(LatLng mLatLng, int index) async {
    final _markerPosition = mLatLng;
    Widget widget = await buildPointMarkWidget(index);
    Uint8List? bd = await MapImageUtil.convertWidgetToImage(widget);
    final Marker marker = Marker(
        position: _markerPosition,
        //使用默认hue的方式设置Marker的图标
        icon: BitmapDescriptor.fromBytes(bd!),
        // icon:  BitmapDescriptor.fromIconPath('image/distract_bg.png')
        onTap: (id) {
          LogUtil.d('点击Marker$id');
        });
    //调用setState触发AMapWidget的更新,从而完成marker的添加
    setState(() {
      //将新的marker添加到map里
      _markers[marker.id] = marker;
    });
  }

  //Mark样式-区域
  Future<Widget> buildAreaMarkWidget(int index) async {
    //带图片的时候需要先把图片缓存一下,否则不显示
    AssetImage provider = AssetImage('image/distract_bg.png');
    await precacheImage(provider, context);
    // Image image = Image(image: provider);
    return Container(
      alignment: Alignment.center,
      width: 150,
      height: 150,
      decoration: BoxDecoration(
        image: DecorationImage(image: AssetImage('image/distract_bg.png')),
      ),
      child: Directionality(
          textDirection: TextDirection.ltr,
          child: Text(makerText[index],
              style: TextStyle(
                  color: Colors.white,
                  fontSize: 25,
                  fontWeight: FontWeight.bold))),
    );
  }

  //Mark样式-区域
  Future<Widget> buildPointMarkWidget(int index) async {
    //带图片的时候需要先把图片缓存一下,否则不显示
    AssetImage provider = AssetImage('image/cb_select.png');
    await precacheImage(provider, context);
    // Image image = Image(image: provider);
    return Container(
      alignment: Alignment.center,
      width: 150,
      height: 150,
      decoration: BoxDecoration(
        image: DecorationImage(image: AssetImage('image/cb_select.png')),
      ),
      child: Directionality(
          textDirection: TextDirection.ltr,
          child: Text("11",
              style: TextStyle(
                  color: Colors.white,
                  fontSize: 25,
                  fontWeight: FontWeight.bold))),
    );
  }

  /*地图定位*/
  void initLocation() {
    //高德定位
    // AMapFlutterLocation.updatePrivacyShow(true, true);
    // AMapFlutterLocation.updatePrivacyAgree(true);
    // AMapFlutterLocation.setApiKey(
    //     "8c278373b54c9c393c74f1d1a2d31d49", "ios ApiKey");
    ///iOS 获取native精度类型
    if (Platform.isIOS) {
      requestAccuracyAuthorization();
    }
    ///注册定位结果监听
    _locationListener = _locationPlugin
        .onLocationChanged()
        .listen((Map<String, Object> result) {
      setState(() {
        _locationResult = result;
        LogUtils.e("高德定位==========="+result.toString());
        LogUtils.e("高德定位latitude==========="+result['latitude'].toString());
        LogUtils.e("高德定位longitude: ==========="+result['longitude'].toString());
        LogUtils.e("高德定位country: ==========="+result['country'].toString());
        LogUtils.e("高德定位province: ==========="+result['province'].toString());
        LogUtils.e("高德定位city: ==========="+result['city'].toString());
        LogUtils.e("高德定位city: ==========="+result['city'].toString());
        LogUtils.e("高德定位district: ==========="+result['district'].toString());
        LogUtils.e("高德定位adCode: ==========="+result['adCode'].toString());
      });
    });
    _setLocationOption();
  }

  ///设置定位参数
  void _setLocationOption() {
    if (null != _locationPlugin) {
      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;

      ///将定位参数设置给定位插件
      _locationPlugin.setLocationOption(locationOption);

      ///开始定位
      _startLocation();
    }
  }

  ///获取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 _startLocation() {
    if (null != _locationPlugin) {
      _locationPlugin.startLocation();
    }
  }

  ///停止定位
  void _stopLocation() {
    if (null != _locationPlugin) {
      _locationPlugin.stopLocation();
    }
  }
  
  void dispose() {
    super.dispose();

    ///移除定位监听
    if (null != _locationListener) {
      _locationListener!.cancel();
    }

    ///销毁定位
    if (null != _locationPlugin) {
      _locationPlugin.destroy();
    }
  }


}

显示效果:

点击后重绘marker:

有关Android集成高德Flutter地图(三)定位的更多相关文章

  1. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  2. ruby-on-rails - 我如何将 Hoptoad 与 DelayedJob 和 DaemonSpawn 集成? - 2

    我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W

  3. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  4. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  7. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

  8. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  9. ruby-on-rails - RailsTutorial - 第 8.4.3 章 - 在集成测试中添加用户后未清除测试数据库 - 2

    我被这个难住了。到目前为止教程中的一切都进行得很顺利,但是当我将这段代码添加到我的/spec/requests/users_spec.rb文件中时,事情开始变得糟糕:describe"success"doit"shouldmakeanewuser"dolambdadovisitsignup_pathfill_in"Name",:with=>"ExampleUser"fill_in"Email",:with=>"ryan@example.com"fill_in"Password",:with=>"foobar"fill_in"Confirmation",:with=>"foobar"cl

  10. ruby-on-rails - 将 Angular JS 与 Rails 集成 - 2

    我需要一些指导来了解如何将Angular整合到rails中。选择Rails的原因:我喜欢他们偏执的做事方式。还有迁移,gem真的很酷。使用angular的原因:我正在研究和寻找最适合SPA的框架。Backbone似乎太抽象了。我不得不在Angular和Ember之间做出选择。我首先开始阅读Angular,它对我来说很有意义。所以我从来没有去读过关于ember的文章。使用Angular和Rails的原因:我研究并尝试使用小型框架,例如grape、slim(是的,我也使用php)。但我觉得需要坚持项目的长期范围。我个人喜欢用Rails的方式做事。这就是我需要帮助的地方,我在Rails4中有

随机推荐