首先需要在高德開放平臺註冊一個用戶,並申請一個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"),
),
),
);
}
}
功能實現~