flutter集成高德地图(一)

flutter集成高德地图(一)申请高德地图api 官网地址:https://lbs.amap.com/ 控制台创建安卓应用 获取本机测试sha1安全码 进入C:\Users\admin.android 执行keytool -lis

申请高德地图api

官网地址:lbs.amap.com/

  1. 控制台创建安卓应用

  2. 获取本机测试sha1安全码

    1. 进入C:\Users\admin.android
    2. 执行keytool -list -v -keystore debug.keystore
    3. 默认秘钥为:android image.png
  3. 打开flutter项目android -> app -> src -> main -> AndroidManifest.xml文件

  4. 第二行代码package对应名称为packageName

生成keystore秘钥

  1. 在目的磁盘下创建文件夹用于存放keystore秘钥文件(这里存放在D盘下)
  2. 命令窗口执行keytool -genkey -v -keystore D:\keystore\key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
  3. 在项目android -> app -> build.gradle添加,对应地址与密码,测试正式可以使用同一个

image.png

  1. 分开使用可访问:www.cnblogs.com/zhireshini/…
  2. 在keystore文件夹执行keytool -list -v -keystore key.jks获取发布版sha1码
  3. 高德地图api key 配置到此完成。

使用flutter 高德地图定位功能

  1. android -> app -> src -> main ->androidManifest.xml配置
    <!--访问网络-->
    <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" />
  1. 在application里配置
<!-- 配置ApiKey -->

        <meta-data             android:name="com.amap.api.v2.apikey"             android:value="高德地图api key" />
        <!-- 配置定位Service -->
        <service android:name="com.amap.api.location.APSService"/>
  1. 将此代码覆盖main.dart
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:permission_handler/permission_handler.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

 

class _MyAppState extends State<MyApp{

  Map<StringObject>? _locationResult;

  StreamSubscription<Map<StringObject>>? _locationListener;

  AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();

  @override

  void initState() {

    super.initState();

 

    /// 动态申请定位权限

    requestPermission();

    ///设置Android和iOS的apiKey<br>

    ///key的申请请参考高德开放平台官网说明<br>

    ///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("android api key""IOS Api Key");

    ///iOS 获取native精度类型

    if (Platform.isIOS) {

      requestAccuracyAuthorization();

    }

    ///注册定位结果监听

    _locationListener = _locationPlugin.onLocationChanged().listen((Map<StringObject> result) {
      print(result);

      setState(() {

        _locationResult = result;

      });

    });

  }

 

  @override

  void dispose() {

    super.dispose();

    ///移除定位监听

    if (null != _locationListener) {

      _locationListener?.cancel();

    }

    ///销毁定位

    _locationPlugin.destroy();

  }

  ///设置定位参数

  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端的定位模式<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);

  }

  ///开始定位

  void _startLocation() {

    ///开始定位之前设置定位参数

    _setLocationOption();

    _locationPlugin.startLocation();

  }

  ///停止定位

  void _stopLocation() {

    _locationPlugin.stopLocation();

  }

  Container _createButtonContainer() {

    return new Container(

        alignment: Alignment.center,

        child: new Row(

          mainAxisSize: MainAxisSize.min,

          crossAxisAlignment: CrossAxisAlignment.center,

          children: <Widget>[

            new ElevatedButton(

              onPressed: _startLocation,

              child: new Text('开始定位'),

              style: ButtonStyle(

                backgroundColor: MaterialStateProperty.all(Colors.blue),

                foregroundColor: MaterialStateProperty.all(Colors.white),

              ),

            ),

            new Container(width: 20.0),

            new ElevatedButton(

              onPressed: _stopLocation,

              child: new Text('停止定位'),

              style: ButtonStyle(

                backgroundColor: MaterialStateProperty.all(Colors.blue),

                foregroundColor: MaterialStateProperty.all(Colors.white),

              ),

            )

          ],

        ));

  }

  Widget _resultWidget(key, value) {

    return new Container(

      child: new Row(

        mainAxisSize: MainAxisSize.min,

        crossAxisAlignment: CrossAxisAlignment.center,

        children: <Widget>[

          new Container(

            alignment: Alignment.centerRight,

            width: 100.0,

            child: new Text('$key :'),

          ),

          new Container(width: 5.0),

          new Flexible(child: new Text('$value', softWrap: true)),

        ],

      ),

    );

  }

  @override

  Widget build(BuildContext context) {

    List<Widget> widgets = <Widget>[];

    widgets.add(_createButtonContainer());

    if (_locationResult != null) {

      _locationResult?.forEach((key, value) {

        widgets.add(_resultWidget(key, value));

      });

    }

 

    return new MaterialApp(

        home: new Scaffold(

          appBar: new AppBar(

            title: new Text('AMap Location plugin example app'),

          ),

          body: new Column(

            crossAxisAlignment: CrossAxisAlignment.start,

            mainAxisSize: MainAxisSize.min,

            children: widgets,

          ),

        ));

  }

 

  ///获取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<bool> 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;

      }

    }

  }

}
  1. 最后执行 flutter run

image.png

今天的文章flutter集成高德地图(一)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18829.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注