定位
Android
参考链接
创建应用
创建Key
输入Key的名称
服务平台选择Android平台
接下里获取SHA1
PackageName输入项目的包名
打开Android目录,并生成签名文件
如果存在签名文件,如下图
若没有签名文件,则需要Create New 创建新的签名文件
填写密码,别名、文件位置等信息
创建完后,会发现目录下有签名文件,可以移到app目录下
配置签名文件
signingConfigs {
release {
//keystore中key的别名
keyAlias 'key0'
//keystore中key的密码
keyPassword '123456'
//keystore的文件路径,可以是绝对路径也可以是相对路径
storeFile file('./deman_mobo.jks')
//keystore的密码l
storePassword '123456'
}
}
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.release
minifyEnabled true //删除无用代码
shrinkResources true //删除无用资源
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.release
debuggable true
}
}
获取签名文件的SHA1
keytool -list -v -keystore ./gaode_key.jks
引入依赖
dependencies {
implementation('com.amap.api:location:5.6.0')
}
Flutter 配置项目
amap_flutter_location: ^3.0.0
permission_handler: ^11.3.0
申明权限
<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许获取精确位置,精准定位必选-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--允许获取粗略位置,粗略定位必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--允许获取设备和运营商信息,用于问题排查和网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许获取网络状态,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许获取wifi网络信息,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许获取wifi状态改变,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--后台获取位置信息,若需后台定位则必选-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!--用于申请调用A-GPS模块,卫星定位加速-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!--允许写入扩展存储,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
配置服务
<!-- 配置定位Service -->
<service android:name="com.amap.api.location.APSService" />
测试代码
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';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({
super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({
super.key});
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final AMapFlutterLocation flutterLocation = AMapFlutterLocation();
final AMapLocationOption aMapLocationOption = AMapLocationOption(
needAddress: true,
geoLanguage: GeoLanguage.DEFAULT,
onceLocation: false,
locationMode: AMapLocationMode.Hight_Accuracy,
locationInterval: 2000,
pausesLocationUpdatesAutomatically: false,
desiredAccuracy: DesiredAccuracy.Best,
desiredLocationAccuracyAuthorizationMode:
AMapLocationAccuracyAuthorizationMode.FullAccuracy,
distanceFilter: -1,
);
late final StreamSubscription<Map<String, Object>> subscription;
late int count = 0;
void initState() {
AMapFlutterLocation.updatePrivacyShow(true, true);
AMapFlutterLocation.updatePrivacyAgree(true);
requestPermission();
AMapFlutterLocation.setApiKey(
"e51a737b3742762791f3c89f4dc61e6d",
"cb341ecb2fb63ff6965c62a009979f29",
);
if (Platform.isIOS) {
requestAccuracyAuthorization();
}
subscription = flutterLocation.onLocationChanged().listen((event) {
print(event.toString());
});
super.initState();
}
void dispose() {
subscription.cancel();
flutterLocation.destroy();
super.dispose();
}
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: () {
flutterLocation.setLocationOption(aMapLocationOption);
Timer.periodic(const Duration(seconds: 1), (timer) {
count++;
print("定位序列号$count");
flutterLocation.startLocation();
});
},
child: Text("开始定位"),
),
ElevatedButton(
onPressed: () {
flutterLocation.stopLocation();
},
child: Text("停止定位"),
),
],
),
),
);
}
/// 动态申请定位权限
void requestPermission() async {
bool hasLocationWhenInUsePermission =
await requestIosLocationWhenInUserPermission();
if (hasLocationWhenInUsePermission) {
bool hasLocationAlwaysWhenInUsePermission =
await requestIosLocationAlwaysWhenInUserPermission();
if (hasLocationAlwaysWhenInUsePermission) {
} else {
}
} else {
}
}
/// 申请定位权限
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;
}
}
}
Future<bool> requestIosLocationPermission() async {
var status = await Permission.location.status;
if (status == PermissionStatus.granted) {
return true;
} else {
status = await Permission.location.request();
if (status ==