Flutter集成高德地圖獲取定位信息

首先需要在高德開放平臺註冊一個用戶,並申請一個key和你的項目相關聯,地址:https://lbs.amap.com/登錄後進入:控制檯→應用管理→我的應用→創建新應用→添加key(底下附上流程)

 

 應用名稱隨便填寫,符合規則就行

 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然後在需要獲取定位信息的地方引入相關dart文件:import 'package:amap_location/amap_location.dart';

import 'package:flutter/material.dart';

import 'package:amap_location/amap_location.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();
  }

  _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}"),
        ],
      ),
    );
  }
}

下面是效果:擋住的是我自己測試的數據,懂的人自然懂(/一臉奸笑)

對於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"),
        ),
      ),
    );
  }
}

功能實現~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章