前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自学HarmonyOS应用开发(53)- 获取当前位置

自学HarmonyOS应用开发(53)- 获取当前位置

作者头像
面向对象思考
发布2021-07-15 16:47:51
1.3K0
发布2021-07-15 16:47:51
举报
文章被收录于专栏:C++核心准则原文翻译
目前的地图软件只能表示固定位置的地图,我们希望在画面第一次启动时能够显示当前所在位置的地图。

声明定位权限

修改所在HAP的config.json文件,以便获取定位权限:

代码语言:javascript
复制
"reqPermissions": [
  ...
  {
    "name": "ohos.permission.LOCATION",
    "reason": "$string:reason_location",
    "usedScene": {
      "ability": [
        "com.myapplication.LocationAbility"
      ],
      "when": "always"
    }

},
...

申请定位权限

我们通过以下两个方法是申请定位权限的代码:

代码语言:javascript
复制
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方法就可以了。

注册定位响应代码

申请当前位置是一个异步处理,需要准备并注册一个回调对象:

代码语言:javascript
复制
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 {
    @Override
    public void onLocationReport(Location location) {
        HiLog.info(LABEL, "onLocationReport");
        TaskDispatcher uiTaskDispatcher = owner_slice.getUITaskDispatcher();
        Revocable revocable = uiTaskDispatcher.asyncDispatch(new Runnable() {
            @Override
            public void run() {
                tileMap.setLocation(location.getLongitude(), location.getLatitude());
            }
        });
    }

    @Override
    public void onStatusChanged(int type) {
    }

    @Override
    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\

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档