flutter3.0开发—集成高德地图(待完善)

2022-12-27  本文已影响0人  码农界四爷__King

首先登录高德地图 控制台
然后选择创建新应用 里面的应用名称和应用类型根据自己的项目填写

image.png

然后点击新建之后 选择右上角添加 里面的key名称根据项目名称填写
PackageName 则在AndroidManifest.xml文件里面


image.png image.png

接下来如何获取到高德地图的SHA1

在获取SHA1之前需要先把项目进行打包 打包过程中会产生一个****.jks文件

找到你的javaJDK安装路径 然后直接在命令窗口进入该目录,并且进入该目录的bin目录

然后再次执行命令:keytool -list -v -keystore D:\xxxx.jks

C:\Program Files\Java\jdk-11.0.14\bin>keytool -list -v -keystore D:\me\demo1.jks

输入jks的秘钥口令就可以了

111.png

获取到SHA1口令之后复制到对应的地方 然后点击提交可以


image.png

接下里集成高德地图

首先集成插件 amap_flutter_location 网址 https://pub.dev/packages/amap_flutter_location/versions

image.png
dependencies:
  amap_flutter_location: ^3.0.0

接下来配置一下相关信息 在android下的app里面的build.gradle 加上如下代码

implementation('com.amap.api:location:5.2.0')
image.png

然后在android对象里面加入以下代码

image.png image.png
signingConfigs {
        release { //发布版本的签名配置
            storeFile file('demo1.jks')
            keyAlias "key0"
            storePassword "1qaz2wsx"
            keyPassword "1qaz2wsx"
        }
        debug { //调试版本的签名配置
            storeFile file('demo1.jks')
            keyAlias "key0"
            storePassword "1qaz2wsx"
            keyPassword "1qaz2wsx"
        }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }

        debug {
        // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. 
        signingConfig signingConfigs.debug
        }
    }

接下来在AndroidManifest.xml中配置相关代码

image.png
<!--访问网络-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--粗略定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--精确定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--申请调用 A-GPS 模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--用于访问 wifi 网络信息,wifi 信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--用于获取 wifi 的获取权限,wifi 信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!--用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--用于写入缓存数据到扩展存储卡-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

配置定位 Service

image.png
<!-- 配置定位 Service -->
<service android:name="com.amap.api.location.APSService"/>

新建amap.dart文件

import 'package:flutter/material.dart';

import 'dart:async';
// import 'dart:io';
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'; //检测权限的包 需要配置一下  https://pub.dev/packages/permission_handler/install   permission_handler: ^10.2.0

class Amap extends StatefulWidget {
  const Amap({super.key});

  @override
  State<Amap> createState() => _AmapState();
}

class _AmapState extends State<Amap> {
  String _latitude = ""; //纬度
  String _longitude = ""; //经度

  //获取数据
  // Map<String, Object> _locationResult;
  //监听定位
  late StreamSubscription<Map<String, Object>> _locationListener;
  //实例化插件
  final AMapFlutterLocation _locationPlugin = AMapFlutterLocation();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    /// 动态申请定位权限
    requestPermission();

    AMapFlutterLocation.setApiKey(
        "dd2e80f12b3a8253c04ebb5a904f0e5d", "ios ApiKey");

    // 注册定位结果监听
    _locationListener = _locationPlugin
        .onLocationChanged()
        .listen((Map<String, Object> result) {
      setState(() {
        print(result);
        print("-----");
        // _locationResult = result;
        _latitude = result["latitude"].toString();
        _longitude = result["longitude"].toString();
      });
    });
  }

  /// 动态申请定位权限
  void requestPermission() async {
    // 申请权限
    bool hasLocationPermission = await requestLocationPermission();
    if (hasLocationPermission) {
      print("定位权限申请通过");
    } else {
      print("定位权限申请不通过");
    }
  }

  ///  申请定位权限  授予定位权限返回true, 否则返回false
  Future<bool> requestLocationPermission() async {
    //获取当前的权限
    var status = await Permission.location.status;
    print('=====================');
    print(status);
    print(PermissionStatus.granted);
    print('=====================');
    if (status == PermissionStatus.granted) {
      //已经授权
      return true;
    } else {
      //未授权则发起一次申请
      status = await Permission.location.status;
      if (status == PermissionStatus.granted) {
        return true;
      } else {
        return false;
      }
    }
  }

  ///开始定位
  void _startLocation() {
    if (null != _locationPlugin) {
      print('---------');
      print(_locationPlugin);
      print('---------');
      // ///开始定位之前设置定位参数
      _setLocationOption();
      _locationPlugin.startLocation();
    }
  }

  ///设置定位参数
  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);
    }
  }

  @override
  void dispose() {
    super.dispose();

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

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

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('纬度:$_latitude'),
          Text('经度:$_longitude'),
          const SizedBox(
            height: 20,
          ),
          ElevatedButton(
              onPressed: () {
                print('开始定位');
                _startLocation();
              },
              child: const Text("开始定位"))
        ],
      ),
    );
  }
}
上一篇下一篇

猜你喜欢

热点阅读