咱们在外出旅行时,通常须要在酒店 App 中预订酒店。那么,在酒店 App 中是如何获取用户地理位置信息从而实现“左近的酒店”的性能查找?为此,我开发了一款名为 Hotel Booking 的利用。
本文中,我将集成定位服务,并介绍如何应用 getLastlocation 和 getLocationWithAddress 办法、如何应用回调办法,以及如何在 Flutter 中将数据存储到利用中的 Shared Preferences。
定位服务
定位服务帮忙开发者的利用疾速精确地获取用户的地位,并通过 GPS、Wi-Fi 以及基站定位能力来扩大其寰球定位能力。
交融定位:提供一套简略易用的 API,以便您基于 GPS、Wi-Fi 以及基站地位数据来疾速获取用户设施地位。
流动辨认:通过加速度传感器、蜂窝网络信息以及磁力仪等辨认用户的活动状态,帮忙您依据用户行为调整利用。
天文围栏:您能够通过 API 来设置一个感兴趣的区域,以便在特定的动作(例如来到、进入或者勾留在该区域)产生时,您的利用能够接管到告诉。
软件要求
- Android Studio 3.X
- JDK 1.8 及以上
- SDK Platform 19 及以上
- Gradle 4.6 及以上
集成步骤
- 在 AppGallery Connect 中注册华为开发者账号。
- 参考“创立您的 AGC 我的项目”和“在我的项目下增加利用”章节创立利用。
- 依据以后地位来设置数据处理地位。
- 开明所需服务:华为定位服务。
- 生成签名证书指纹。
- 配置签名证书指纹。
- 将您的 agconnect-services.json 文件拷贝到您的利用级根目录下。
重要:增加利用时,输出的利用包名应与您的 Flutter 我的项目包名统一。
留神:下载 agconnect-services.json 文件前,确保已开启所需的 HMS 服务。
开发流程
在 Android Studio 中创立利用。
- 创立 Flutter 我的项目。
- 增加编译依赖。
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" />
- 参考链接下载所需的跨平台插件。
- 实现上述所有步骤后,在 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/
- 增加后,执行 flutter pub get 命令。至此,所有的插件已准备就绪。
- 关上 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);
}
}
后果
舒适提醒
- 请下载最新版本的 HMS 服务 Flutter 插件。
- 如需应用模仿地位性能,须要在 AndroidManifest.xml 文件中增加相干权限。
- 如需更新插件,可点击 pug get 按钮。
欲了解 HMS Core 更多详情,请参阅:
华为开发者联盟官网
获取开发领导文档
参加开发者探讨请到 CSDN 社区或者 Reddit 社区
下载 demo 和示例代码请到 Github 或者 Gitee
解决集成问题请到 Stack Overflow
原文链接:https://developer.huawei.com/…