我们在外出旅行时,通常需要在酒店 App 中预订酒店。那么,在酒店 App 中是如何获取用户地理位置信息从而实现 “附近的酒店”的功能查找?为此,我开发了一款名为 Hotel Booking 的应用。
本文中,我将集成 定位服务 ,并介绍如何使用 getLastlocation 和 getLocationWithAddress 方法、如何使用回调方法,以及如何在 Flutter 中将数据存储到应用中的 Shared Preferences 。
定位服务
定位服务帮助开发者的应用快速准确地获取用户的位置,并通过 GPS 、 Wi-Fi 以及基站定位能力来扩展其全球定位能力。
融合定位 :提供一套简单易用的 API ,以便您基于 GPS 、 Wi-Fi 以及基站位置数据来快速获取用户设备位置。
活动识别 :通过加速度传感器、蜂窝网络信息以及磁力 仪 等识别用户的活动状态,帮助您根据用户行为调整应用。
地理围栏 :您可以通过 API 来设置一个感兴趣的区域,以便在特定的动作(例如离开、进入或者逗留在该区域)发生时,您的应用可以接收到通知。
软件要求
1. Android Studio 3. X
2. JDK 1.8 及以上
3. SDK Platform 19 及以上
4. Gradle 4.6 及以上
集成步骤
1. 在 AppGallery Connect 中 注册华为开发者账号 。
2. 参考 “ 创建您的 AGC 项目” 和 “ 在项目下添加应用” 章节创建应用。
3. 根据当前位置来设置数据处理位置。
4. 开通所需服务:华为定位服务。
5. 生成签名证书指纹。
6. 配置签名证书指纹 。
7. 将您的 agconnect-services.json 文件拷贝到您的应用级根目录下。
重要 :添加应用时,输入的应用包名应与您的 Flutter 项目包名一致。
注意:下载 agconnect-services.json 文件前,确保已开启所需的 HMS 服务。
开发流程
在 Android Studio 中创建应用。
1. 创建 Flutter 项目。
2. 添加编译依赖。
a) 应用级 Gradle 依赖:
在项目中选择“Android > app > build.gradle”。 apply plugin: 'com.android.application' apply plugin: 'com.huawei.agconnect'
b) 项目级 Gradle 依赖:
maven {url 'https://developer.huawei.com/repo/'}
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
在 AndroidManifest.xml 文件中添加如下权限:
<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" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="com.huawei.hms.permission.ACTIVITY_RECOGNITION" />
3. 参考 链接 下载所需的跨平台插件。
4. 完成上述所有步骤后,在 pubspec.yaml 文件中添加对所需的 HMS 服务对应的 Flutter 插件的依赖。您可在 pub.dev 中找到最新版本的插件。
dependencies: flutter: sdk: flutter shared_preferences: ^0.5.12+4 bottom_navy_bar: ^5.6.0 cupertino_icons: ^1.0.0 provider: ^4.3.3 huawei_location: path: ../huawei_location/ flutter: uses-material-design: true assets: - assets/images/
5. 添加后,执行 flutter pub get 命令。至此,所有的插件已准备就绪。
6. 打开 main.dart 文件来创建 UI 和业务逻辑。
集成定位服务
权限
首先,应用需要有访问位置数据和物理数据的权限。
创建 PermissionHandler 实例,并调用 initState() 方法来初始化实例。
final PermissionHandler permissionHandler;
@override
void initState() {
permissionHandler = PermissionHandler(); super.initState();
}
检查权限
调用 hasLocationPermission() 方法来检查设备是否有所需的权限。
void hasPermission() async {
try {
final bool status = await permissionHandler.hasLocationPermission();
if(status == true){
showToast("Has permission: $status");
}else{
requestPermission();
}
} on PlatformException catch (e) {
showToast(e.toString());
}
}
如果设备没有所需权限,调用 requestLocationPermission() 方法来申请相关权限。
void requestPermission() async {
try {
final bool status = await permissionHandler.requestLocationPermission();
showToast("Is permission granted");
} on PlatformException catch (e) {
showToast(e.toString());
}
}
融合定位
使用 init() 方法创建 FusedLocationPrvoiderClient 实例,然后使用该实例调用定位 API 。
final FusedLocationProviderClient locationService
@override
void initState() {
locationService = FusedLocationProviderClient(); super.initState();
}
位置更新事件
调用 onLocationData() 方法来侦听位置更新事件。
StreamSubscription<Location> streamSubscription
@override
void initState() {
streamSubscription = locationService.onLocationData.listen((location) {});super.initState();
}
getLastLocation()
void getLastLocation() async {
try {
Location location = await locationService.getLastLocation();
setState(() {
lastlocation = location.toString();
print("print: " + lastlocation);
});
} catch (e) {
setState(() {
print("error: " + e.toString());
});
}
}
getLastLocationWithAddress()
创建 LocationRequest 实例,并设置相关参数。
final LocationRequest locationRequest;
locationRequest = LocationRequest()
..needAddress = true
..interval = 5000;
void _getLastLocationWithAddress() async {
try {
HWLocation location =
await locationService.getLastLocationWithAddress(locationRequest);
setState(() {
String street = location.street;
String city = location.city;
String countryname = location.countryName;
currentAddress = '$street' + ',' + '$city' + ' , ' + '$countryname';
print("res: $location");
});
showToast(currentAddress);
} on PlatformException catch (e) {
showToast(e.toString());
}
}
通过 Callback 进行位置更新
创建 LocationCallback 实例,并在 initstate() 中创建回调函数。
LocationCallback locationCallback;
@override
void initState() {
locationCallback = LocationCallback(
onLocationResult: _onCallbackResult,
onLocationAvailability: _onCallbackResult,
);
super.initState();
}
void requestLocationUpdatesCallback() async {
if (_callbackId == null) {
try {
final int callbackId = await locationService.requestLocationUpdatesExCb(
locationRequest, locationCallback);
_callbackId = callbackId;
} on PlatformException catch (e) {
showToast(e.toString());
}
} else {
showToast("Already requested location updates.");
}
}
void onCallbackResult(result) {
print(result.toString());
showToast(result.toString());
}
我创建了一个 Helper 类,用于通过 Shared Preferences 在本地存储用户登录信息。
class StorageUtil {
static StorageUtil _storageUtil;
static SharedPreferences _preferences;
static Future<StorageUtil> getInstance() async {
if (_storageUtil == null) {
var secureStorage = StorageUtil._();
await secureStorage._init();
_storageUtil = secureStorage;
}
return _storageUtil;
}
StorageUtil._();
Future _init() async {
_preferences = await SharedPreferences.getInstance();
}
// get string
static String getString(String key) {
if (_preferences == null) return null;
String result = _preferences.getString(key) ?? null;
print('result,$result');
return result;
}
// put string
static Future<void> putString(String key, String value) {
if (_preferences == null) return null;
print('result $value');
return _preferences.setString(key, value);
}
}
结果

温馨提示
1. 请下载最新版本的 HMS 服务 Flutter 插件。
2. 如需使用模拟位置功能,需要在 AndroidManifest.xml 文件中添加相关权限。
3. 如需更新插件,可点击 pug get 按钮。
欲了解
HMS Core
更多详情,请参阅:
>>
华为开发者联盟官网
>>
获取开发指导文档
>>
参与开发者讨论请到
CSDN社区
或者
Reddit
社区
>>
下载
demo
和示例代码请到
Github
或者
Gitee
>>
解决集成问题请到
Stack Overflow
原文链接: https://developer.huawei.com/consumer/cn/forum/topic/0202558665631260611?fid=18
原作者:胡椒
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69970551/viewspace-2778568/ ,如需转载,请注明出处,否则将追究法律责任。