Flutter集成高德地图获取定位信息

25 篇文章 0 订阅
2 篇文章 0 订阅

首先需要在高德开放平台注册一个用户,并申请一个key和你的项目相关联,地址:https://lbs.amap.com/登录后进入:控制台→应用管理→我的应用→创建新应用→添加key(底下附上流程)

3月11日:更新显示map代码,下面是全部代码

 应用名称随便填写,符合规则就行

 key名称也是符合规则下随便写;服务平台看自己需求;发布版安全码和调试版安全码SHA1我之前已经介绍过如何获取,有不知道的小伙伴可以前去https://blog.csdn.net/Gemini_Kanon/article/details/104531219参考;PackageName一定要和你自己项目的报名对应上否则无法获取定位信息,如何获取上面有介绍!

最后点击提交等待完成后就能看到你自己的key了~

然后需要在项目中进行一些配置:

1、项目的android→app下的build.gradle:找到对应的地方把这两个配置搞上去(个人最近只做的安卓app,ios系统还未配置)

defaultConfig {
    manifestPlaceholders = [
        AMAP_KEY : "你自己的key", /// 高德地图key
    ]
}


dependencies {
    implementation 'com.amap.api:location:latest.integration'
}

以下是代码部分:

引入资源文件amap_location:https://pub.dev/packages/amap_location

                                                 https://pub.dev/packages/amap_map_fluttify

然后在需要获取定位信息的地方引入相关dart文件:import 'package:amap_location/amap_location.dart';

                                                                                  import 'package:amap_map_fluttify/amap_map_fluttify.dart';

import 'package:flutter/material.dart';

import 'package:amap_location/amap_location.dart';
import 'package:amap_map_fluttify/amap_map_fluttify.dart';

//高德地图获取地理位置
class LocationPage extends StatefulWidget {
  LocationPage({Key key}) : super(key : key);
  _LocationPageState createState() => _LocationPageState();
}

class _LocationPageState extends State<LocationPage> {
  double longitude = 0.0;
  double latitude = 0.0;

  @override
  void initState() {
    super.initState();
    this._getLocation();
  }

  _getLocation () async {
    //启动一下
    await AMapLocationClient.startup(new AMapLocationOption(desiredAccuracy: CLLocationAccuracy.kCLLocationAccuracyBest));
    //获取地理位置(直接定位)
    var result = await AMapLocationClient.getLocation(true);
    setState(() {
      this.longitude = result.longitude;   //经度
      this.latitude = result.latitude;   //纬度
    });
  }

  @override
  void dispose() {
    //停止监听定位、销毁定位
    AMapLocationClient.stopLocation();
    AMapLocationClient.shutdown();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("获取位置信息"),
      ),
      body: Column(
        children: <Widget>[
          Center(
            child: RaisedButton(
              child: Text("获取位置"),
              onPressed: (){
                _getLocation();
              },
            ),
          ),
          Text("经度:${this.longitude}"),
          Text("纬度:${this.latitude}"),
          //显示地图
          Container(
            width: double.infinity,
            height: ScreenAdapter.height(300.0),
            child: Stack(
              children: <Widget>[
                AmapView(
                  mapType: MapType.Standard,
                  showZoomControl: false,
                  zoomLevel: 15,
                  centerCoordinate: LatLng(this.latitude,this.longitude),
                  onMapCreated: (controller) async{
                    await controller.showMyLocation(true);
                  },
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

下面是效果:挡住的是我自己测试的数据,懂的人自然懂(/一脸奸笑)

对于Android6.0以上的手机需要手动获取一下定位权限(或者手动到设置里把软件的定位权限打开),否则无法获得定位信息,amap_location网站上有一个获取定位权限的代码,放到自己的代码里报错,整了一会儿没整好,索性我又找了一段获取定位权限的代码,下面贴一下:

首先在你的项目里引入permission_handler,然后在对应文件里引入dart文件就可以了,小编这里直接放到main入口里了,进程序直接打开权限,以后都用得上~

import 'package:flutter/material.dart';

import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MyApp());

//温馨提示,这里的MyApp需要继承StatefulWidget才能重写初始化函数
class MyApp extends StatelessWidget {
  //这么写会直接报错
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,   //去掉debug图标
      initialRoute: "/",
      onGenerateRoute: onGenerateRoute,
      theme: ThemeData(
        //屏幕右滑返回上一页
        platform: TargetPlatform.iOS,
      ),
    );
  }
}

//改成如下写法
class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    this.checkPersmission();
  }

  void checkPersmission() async {
    // 申请权限
    Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.location]);
    // 申请结果
    PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.location);
    if (permission == PermissionStatus.granted) {
      //_getLocation();
    } else {
      bool isOpened = await PermissionHandler().openAppSettings();//打开应用设置
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("111"),
        ),
        body: Center(
          child: Text("111"),
        ),
      ),
    );
  }
}

功能实现~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值