由于众所周知的原因,国内无法使用location提供的谷歌定位服务,所以只能使用百度地图或者高德地图提供的定位服务。
所幸双方都已经实现了对flutter的支持。百度地图的api和配置比高德要简单那么一丢丢,不过包好像很久没更新,以至于错误很多。最终还是选了高德地图来实现。
官方文档地址
https://lbs.amap.com/api/flutter/gettingstarted
1. 获取高德Key
在控制台创建新的应用获取key
创建新应用
应用名称自定义,可以随便写。类型选择相符的就可以,这个不会严格审查的。
应用下面可以有好几个key,key的名称可以自定义,平台选择对应的平台。
申请key需要填写debug版本和release版本的keystore
keystore和Keytool是什么
Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。 在keystore里,包含两种数据:
密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
可信任的证书实体(trusted certificate entries)——只包含公钥
Keystore可以简单理解为一个存放应用签名的文件。
调试版安全码SHA1
我是mac,进入当前用户文件夹下的~/.android目录(windows在c:/user/.android),里面有debug.keystore文件,运行命令获取该文件sha1
cd ~/.android
keytool -list -v -keystore debug.keystore
如果keytool不存在则需要安装jdk。
如果debug.keystore不存在,则需要使用keytool -genkey命令生成一个debug.keystore
输入密钥口令,默认是 android,即可获得SHA1安全码
发布版安全码SHA1
如果没有过apk还没有keystore签名文件,则需要生成,
生成keystore签名文件
keytool -genkey -v -keystore mykey.keystore -alias key -keyalg RSA -keysize 2048 -validity 10000
填写好资料
生成后的文件在mac用户目录
命令行直接使用keytool进行得到mykey.keystore的sha1,在文件目录下运行
keytool -list -v -keystore mykey.keystore
即可得到发布版安全码,apk就用这个keystore文件进行签名,这样就没问题了。
如果需要把apk签名,具体方法请看:
https://www.jianshu.com/p/398d41128b02
PackageName
在 android/app/build.gradle 中获取包名
提交保存后即可获得Key。
集成SDK
在 android/build.gradle 文件中,添加mavenCentral()或者 jcenter()
allprojects { repositories { jcenter() // 或者 mavenCentral() } }
在 android/app/build.gradle 中,配置依赖:
dependencies {
...
implementation 'com.amap.api:location:latest.integration'
}
添加服务、声明定位权限
Android:
在 android/app/src/main/AndroidManifest.xml 文件中
1、添加服务
2、声明权限
ios:
1、ios/info.plist加入
NSLocationWhenInUseUsageDescription
使用当前位置信息
NSLocationAlwaysUsageDescription
实时使用当前的位置信息
NSLocationAlwaysAndWhenInUseUsageDescription
实时使用当前的位置信息
2、ios/Padfile末尾加入
target.build_configurations.each do |config|
# Here are some configurations automatically generated by flutter
# You can enable the permissions needed here. For example to enable camera
# permission, just remove the `#` character in front so it looks like this:
#
# ## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=1'
#
# Preprocessor definitions can be found in: https://github.com/Baseflow/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.calendar
# 'PERMISSION_EVENTS=1',
## dart: PermissionGroup.reminders
# 'PERMISSION_REMINDERS=1',
## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=1',
## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',
## dart: PermissionGroup.microphone
'PERMISSION_MICROPHONE=1',
## dart: PermissionGroup.speech
# 'PERMISSION_SPEECH_RECOGNIZER=1',
## dart: PermissionGroup.photos
'PERMISSION_PHOTOS=1',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=1',
## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=1',
## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=1',
## dart: PermissionGroup.sensors
# 'PERMISSION_SENSORS=1',
## dart: PermissionGroup.bluetooth
# 'PERMISSION_BLUETOOTH=1',
## dart: PermissionGroup.appTrackingTransparency
# 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
## dart: PermissionGroup.criticalAlerts
# 'PERMISSION_CRITICAL_ALERTS=1'
]
end
如图:
引入高德定位Flutter插件
# 高德地图
amap_flutter_location: ^3.0.0
获取定位
代码中填入申请好的高德apikey)
import 'dart:async';
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';
/*
//使用
locationUtil.getCurrentLocation((Map result){
print('接收到result:$result');
}).catchError((err){
Fluttertoast.showToast(msg: err);
});
*/
class LocationUtil {
StreamSubscription
错误
Could not resolve com.amap.api:location:latest.integration.
如果出现这个错误,是因为build的时候,会去云端仓库请求最新的包列表,如果请求不到,则会无法build。我们可以指定包。
查看最新的包:https://lbs.amap.com/api/android-location-sdk/guide/create-project/android-studio-create-project
编辑android/app/build.gradle
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.amap.api:location:3.3.0'//指定版本高德定位插件,
//implementation 'com.amap.api:location:latest.integration'//最新版高德定位插件
}