咱们在外出旅行时,通常须要在酒店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" />
  1. 参考链接下载所需的跨平台插件。
  2. 实现上述所有步骤后,在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/
  1. 增加后,执行flutter pub get命令。至此,所有的插件已准备就绪。
  2. 关上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
原作者:胡椒