前言:兄弟们,咱们这个基础部分是已经结束了,学会之前的那些骚操作就基本上可以自己写点小东西玩玩了,现在来讲讲一些开发中常用的功能。

定位是我们开发中常用的功能,为了帮助大家理解,我冒着生命危险从高德总部偷出来了这一份方案!!
(求大家给个三联,我好跑路啊)
话不多说,先上效果图:

准备阶段:
1.插件准备:
amap_flutter_location: ^2.0.0 #高德地图
插件地址
permission_handler: ^8.1.4 #权限管理,获取定位权限用
插件地址
2.在高德的开发者平台申请key:
第一步:注册开发者账号
高德开发者地址在这里 
第二步:创建新的应用,并申请key

第三步:

关于如何获取SHA1,以及处理高德定位使用中的报错下一篇文章会详细的讲解
第四步获取到key:

第五步:获取自己需要的SDk

这样准备步骤就完成了。
第一步:SDK与权限处理
SDK处理:
在app文件夹下创建libs文件夹,把下载的SDK放入
 然后在build.gradle中配置SDK:
dependencies{
implementation fileTree(include: ['*.zip'], dir: 'libs')
implementation('com.amap.api:location:5.2.0')
compile 'com.amap.api:location:latest.integration'
}
权限处理:
在这个文件下配置: 
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--访问网络-->
<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" />
第二步:配置Key
仍在这个文件中: 
在application下:
meta-data
android:name="com.amap.api.v2.apikey"
android:value="//你自己的Key" />
<service android:name="com.amap.api.location.APSService"/> //定位
现在所有的配置都完成了!
第三步:代码使用
代码可以之间使用,放置文末了,只需要把自己的key替换一下
我们来看看官网的一些api:
定位结果是以map的形式返回的,具体内容为
详细代码:记得替换自己的Key哦!
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:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
String _locationText;
class AmapPage extends StatefulWidget {
@override
_AmapPageState createState() => new _AmapPageState();
}
class _AmapPageState extends State<AmapPage> {
Map<String, Object> _locationResult;
StreamSubscription<Map<String, Object>> _locationListener;
AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
@override
void initState() {
super.initState();
requestPermission();
AMapFlutterLocation.setApiKey(
"自己的key", "自己的key");
if (Platform.isIOS) {
requestAccuracyAuthorization();
}
_locationListener = _locationPlugin
.onLocationChanged()
.listen((Map<String, Object> result) {
setState(() {
_locationResult = result;
print('定位结果${result}');
_locationText = ' ' +
_locationResult['province'] +
_locationResult['city'] +
_locationResult['district'] +
_locationResult['street'];
});
print('详细信息${_locationText}');
});
}
@override
void dispose() {
super.dispose();
if (null != _locationListener) {
_locationListener.cancel();
}
if (null != _locationPlugin) {
_locationPlugin.destroy();
}
}
void _setLocationOption() {
if (null != _locationPlugin) {
AMapLocationOption locationOption = new AMapLocationOption();
locationOption.onceLocation = false;
locationOption.needAddress = true;
locationOption.geoLanguage = GeoLanguage.ZH;
locationOption.desiredLocationAccuracyAuthorizationMode =
AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
locationOption.locationInterval = 2000;
locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
locationOption.distanceFilter = -1;
locationOption.desiredAccuracy = DesiredAccuracy.Best;
locationOption.pausesLocationUpdatesAutomatically = false;
_locationPlugin.setLocationOption(locationOption);
}
}
void _startLocation() {
if (null != _locationPlugin) {
_setLocationOption();
_locationPlugin.startLocation();
}
}
void _stopLocation() {
if (null != _locationPlugin) {
_locationPlugin.stopLocation();
}
}
Container _createButtonContainer() {
return new Container(
alignment: Alignment.center,
child: new Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new RaisedButton(
onPressed: _startLocation,
child: new Text('开始定位'),
color: Colors.blue,
textColor: Colors.white,
),
new Container(width: 20.0),
new RaisedButton(
onPressed: _stopLocation,
child: new Text('停止定位'),
color: Colors.blue,
textColor: 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 = new List();
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('高德定位测试'),
),
body: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: widgets,
),
));
}
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("定位权限申请不通过");
}
}
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;
}
}
}
}
欢迎留言纠正 ~ 不妨给个点赞哈哈
我是阿T一个幽默的程序员 我们下期再见~
添加我为你的好友,领取源码以及Flutter学习资料~

加入我们吧,一起学习,一起进步~

|