自学HarmonyOS应用开发(53)- 获取当前位置
目前的地图软件只能表示固定位置的地图,我们希望在画面第一次启动时能够显示当前所在位置的地图。首先来看动作效果视频:
声明定位权限
修改所在HAP的config.json文件,以便获取定位权限:
"reqPermissions": [
...
{
"name": "ohos.permission.LOCATION",
"reason": "$string:reason_location",
"usedScene": {
"ability": [
"com.myapplication.LocationAbility"
],
"when": "always"
}
},
...
申请定位权限
我们通过以下两个方法是申请定位权限的代码:
private void register(Context ability) {
context = ability;
requestPermission(PERM_LOCATION);
}
private void requestPermission(String permission) {
if (context.verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED) {
context.requestPermissionsFromUser(new String[] {permission}, 0);
}
}
有了这两个方法,我们只要在适当的位置调用register方法就可以了。
注册定位响应代码
申请当前位置是一个异步处理,需要准备并注册一个回调对象:
private void registerLocationEvent() {
if (hasPermissionGranted(PERM_LOCATION)) {
locator = new Locator(context);
requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);
locator.requestOnce(requestParam, locatorCallback);
}
}
private void unregisterLocationEvent() {
if (locator != null) {
locator.stopLocating(locatorCallback);
}
}
private boolean hasPermissionGranted(String permission) {
return context.verifySelfPermission(permission) == IBundleManager.PERMISSION_GRANTED;
}
private class MyLocatorCallback implements LocatorCallback {
public void onLocationReport(Location location) {
HiLog.info(LABEL, "onLocationReport");
TaskDispatcher uiTaskDispatcher = owner_slice.getUITaskDispatcher();
Revocable revocable = uiTaskDispatcher.asyncDispatch(new Runnable() {
public void run() {
tileMap.setLocation(location.getLongitude(), location.getLatitude());
}
});
}
public void onStatusChanged(int type) {
}
public void onErrorReport(int type) {
}
}
在registerLocationEvent方法用来注册一个单次定位事件请求;在定位事件响应对象中我们将获得的位置信息通知给地图对象。
参考代码
获取设备的位置信息:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/device-location-info-0000000000031900
完整代码可以从以下链接下载:
https://github.com/xueweiguo/Harmony/tree/master/StopWatch
参考资料
Slippy map tilenames(包含各种转换示例代码):
https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames\
作者著作介绍
《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!