flutter3.0开发—集成高德地图(待完善)
2022-12-27 本文已影响0人
码农界四爷__King
首先登录高德地图 控制台
然后选择创建新应用 里面的应用名称和应用类型根据自己的项目填写
然后点击新建之后 选择右上角添加 里面的key名称根据项目名称填写
PackageName 则在AndroidManifest.xml文件里面
image.png image.png
接下来如何获取到高德地图的SHA1
在获取SHA1之前需要先把项目进行打包 打包过程中会产生一个****.jks文件
找到你的javaJDK安装路径 然后直接在命令窗口进入该目录,并且进入该目录的bin目录
然后再次执行命令:keytool -list -v -keystore D:\xxxx.jks
C:\Program Files\Java\jdk-11.0.14\bin>keytool -list -v -keystore D:\me\demo1.jks
输入jks的秘钥口令就可以了
111.png获取到SHA1口令之后复制到对应的地方 然后点击提交可以
image.png
接下里集成高德地图
首先集成插件 amap_flutter_location 网址 https://pub.dev/packages/amap_flutter_location/versions
dependencies:
amap_flutter_location: ^3.0.0
接下来配置一下相关信息 在android下的app里面的build.gradle 加上如下代码
implementation('com.amap.api:location:5.2.0')
image.png
然后在android对象里面加入以下代码
image.png image.pngsigningConfigs {
release { //发布版本的签名配置
storeFile file('demo1.jks')
keyAlias "key0"
storePassword "1qaz2wsx"
keyPassword "1qaz2wsx"
}
debug { //调试版本的签名配置
storeFile file('demo1.jks')
keyAlias "key0"
storePassword "1qaz2wsx"
keyPassword "1qaz2wsx"
}
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
debug {
// TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
接下来在AndroidManifest.xml中配置相关代码
image.png<!--访问网络-->
<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" />
配置定位 Service
image.png<!-- 配置定位 Service -->
<service android:name="com.amap.api.location.APSService"/>
新建amap.dart文件
import 'package:flutter/material.dart';
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:permission_handler/permission_handler.dart'; //检测权限的包 需要配置一下 https://pub.dev/packages/permission_handler/install permission_handler: ^10.2.0
class Amap extends StatefulWidget {
const Amap({super.key});
@override
State<Amap> createState() => _AmapState();
}
class _AmapState extends State<Amap> {
String _latitude = ""; //纬度
String _longitude = ""; //经度
//获取数据
// Map<String, Object> _locationResult;
//监听定位
late StreamSubscription<Map<String, Object>> _locationListener;
//实例化插件
final AMapFlutterLocation _locationPlugin = AMapFlutterLocation();
@override
void initState() {
// TODO: implement initState
super.initState();
/// 动态申请定位权限
requestPermission();
AMapFlutterLocation.setApiKey(
"dd2e80f12b3a8253c04ebb5a904f0e5d", "ios ApiKey");
// 注册定位结果监听
_locationListener = _locationPlugin
.onLocationChanged()
.listen((Map<String, Object> result) {
setState(() {
print(result);
print("-----");
// _locationResult = result;
_latitude = result["latitude"].toString();
_longitude = result["longitude"].toString();
});
});
}
/// 动态申请定位权限
void requestPermission() async {
// 申请权限
bool hasLocationPermission = await requestLocationPermission();
if (hasLocationPermission) {
print("定位权限申请通过");
} else {
print("定位权限申请不通过");
}
}
/// 申请定位权限 授予定位权限返回true, 否则返回false
Future<bool> requestLocationPermission() async {
//获取当前的权限
var status = await Permission.location.status;
print('=====================');
print(status);
print(PermissionStatus.granted);
print('=====================');
if (status == PermissionStatus.granted) {
//已经授权
return true;
} else {
//未授权则发起一次申请
status = await Permission.location.status;
if (status == PermissionStatus.granted) {
return true;
} else {
return false;
}
}
}
///开始定位
void _startLocation() {
if (null != _locationPlugin) {
print('---------');
print(_locationPlugin);
print('---------');
// ///开始定位之前设置定位参数
_setLocationOption();
_locationPlugin.startLocation();
}
}
///设置定位参数
void _setLocationOption() {
if (null != _locationPlugin) {
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);
}
}
@override
void dispose() {
super.dispose();
///移除定位监听
if (null != _locationListener) {
_locationListener.cancel();
}
///销毁定位
if (null != _locationPlugin) {
_locationPlugin.destroy();
}
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('纬度:$_latitude'),
Text('经度:$_longitude'),
const SizedBox(
height: 20,
),
ElevatedButton(
onPressed: () {
print('开始定位');
_startLocation();
},
child: const Text("开始定位"))
],
),
);
}
}