• 【JAVA UI】HarmonyOS 定位的功能基本实现


     参考资料

    位置开发概述

    基于HarmonyOS获取设备位置(Java)

    一、api讲解

    1、准备工作

    权限集成,需要在config.json文件中添加定位权限,代码如下所示

    1. "reqPermissions": [
    2. {"name": "ohos.permission.LOCATION"}
    3. ],

    在MainAbility界面进行动态申请定位权限,代码如下

    1. String[] permissions = {
    2. SystemPermission.LOCATION
    3. };
    4. requestPermissionsFromUser(permissions, 0);

    2、实例化Locator对象

    实例化Locator对象,代码如下

    Locator locator = new Locator(context);

    3、实例化LocatorCallback对象

    实例化LocatorCallback对象,用于向系统提供位置上报的途径,代码如下

    1. /**
    2. * 定位回调
    3. */
    4. public class MyLocatorCallback implements LocatorCallback {
    5. /**
    6. * 定位成功的回调,用于开发者获取具体地理的经纬度详细信息
    7. * @param location 定位成功返回的对象
    8. */
    9. @Override
    10. public void onLocationReport(Location location) {
    11. }
    12. /**
    13. *定位的时候,定位服务状态发生改变的时候,触发这个函数
    14. * @param type 服务状态码,有如下几个状态
    15. * Locator.SESSION_START 表示定位请求已被系统接受。
    16. * Locator.SESSION_STOP 指示位置请求已完成。
    17. */
    18. @Override
    19. public void onStatusChanged(int type) {
    20. HiLog.error(LABEL,"状态改变");
    21. }
    22. /**
    23. * 定位失败触发此函数
    24. * @param type 定位失败错误码,具体状态如下
    25. * 1. Locator.ERROR_PERMISSION_NOT_GRANTED: 应用程序调用定位器接口时,尚未授予定位权限
    26. * 2.Locator.ERROR_SWITCH_UNOPEN :应用程序调用定位器接口时,位置服务已禁用(GPS 功能未打开)
    27. */
    28. @Override
    29. public void onErrorReport(int type) {
    30. HiLog.error(LABEL,"定位失败");
    31. }
    32. }

    4、实例化RequestParam对象,

    实例化RequestParam对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率,(具体参数参考位置开发概述)代码如下

    RequestParam requestParam = new RequestParam(RequestParam.PRIORITY_ACCURACY, 0, 0);

    5、开始定位

    locator.startLocating(requestParam, locatorCallback);

    6、停止定位

    locator.stopLocating(locatorCallback);

    7、(逆)地理编码转化

    实例化GeoConvert对象,代码如下

    1. //todo 实例化GeoConvert对象
    2. GeoConvert geoConvert = new GeoConvert();

    8、获取转化结果

    调用getAddressFromLocation(double latitude, double longitude, int maxItems),坐标转化地理位置信息,代码如下

    1. /**
    2. * 获取地理位置
    3. * latitude:当前的经度
    4. *longitude:当前的维度
    5. * maxItems:指定返回的地址列表的最大长度。建议取值范围为1-5。如果指定的值小于1,则使用默认值1。
    6. */
    7. geoConvert.getAddressFromLocation(40.0, 116.0, 1);

    二、代码实现

    绘制xml界面

    绘制xml界面,一个text组件用于基本的定位和并获取经纬度然后(逆)地理编码转化获取具体地理位置,一个text组件用于显示结果,代码如下

    1. <DirectionalLayout
    2. xmlns:ohos="http://schemas.huawei.com/res/ohos"
    3. ohos:height="match_parent"
    4. ohos:width="match_parent"
    5. ohos:alignment="top"
    6. ohos:orientation="vertical">
    7. <Text
    8. ohos:text_alignment="center"
    9. ohos:id="$+id:text_start_Location"
    10. ohos:height="80vp"
    11. ohos:width="match_parent"
    12. ohos:background_element="$graphic:background_ability_main"
    13. ohos:layout_alignment="horizontal_center"
    14. ohos:text="开始定位"
    15. ohos:text_size="20vp"
    16. />
    17. <Text
    18. ohos:text_alignment="horizontal_center"
    19. ohos:id="$+id:text_result"
    20. ohos:height="match_parent"
    21. ohos:width="match_parent"
    22. ohos:background_element="#ed6262"
    23. ohos:layout_alignment="horizontal_center"
    24. ohos:multiple_lines="true"
    25. ohos:text="显示结果"
    26. ohos:text_size="20vp"
    27. />
    28. DirectionalLayout>

    java代码实现

    1. package com.newdemo.myapplication.slice;
    2. import com.newdemo.myapplication.ResourceTable;
    3. import ohos.aafwk.ability.AbilitySlice;
    4. import ohos.aafwk.content.Intent;
    5. import ohos.agp.components.Component;
    6. import ohos.agp.components.Text;
    7. import ohos.hiviewdfx.HiLog;
    8. import ohos.hiviewdfx.HiLogLabel;
    9. import ohos.location.*;
    10. import java.util.List;
    11. public class MainAbilitySlice extends AbilitySlice {
    12. private Locator locator;
    13. private GeoConvert geoConvert;
    14. private Text Text_result;//todo 结果按钮
    15. static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");
    16. @Override
    17. public void onStart(Intent intent) {
    18. super.onStart(intent);
    19. super.setUIContent(ResourceTable.Layout_ability_main);
    20. //todo 查找显示结果按钮
    21. Text_result= (Text) findComponentById(ResourceTable.Id_text_result);
    22. //todo 实例化locator对象
    23. locator= new Locator(MainAbilitySlice.this);
    24. //todo 构造requestParam参数
    25. RequestParam requestParam = new RequestParam(RequestParam.PRIORITY_ACCURACY, 0, 0);
    26. MyLocatorCallback locatorCallback = new MyLocatorCallback();
    27. //todo 实例化geoConvert
    28. geoConvert = new GeoConvert();
    29. /**
    30. * 实现按钮事件 开始定位
    31. */
    32. findComponentById(ResourceTable.Id_text_start_Location).setClickedListener(new Component.ClickedListener() {
    33. @Override
    34. public void onClick(Component component) {
    35. //为开启定位服务方法
    36. locator.requestOnce(requestParam, locatorCallback);
    37. }
    38. });
    39. }
    40. /**
    41. * 定位回调
    42. */
    43. public class MyLocatorCallback implements LocatorCallback {
    44. /**
    45. * 定位成功的回调,用于开发者获取具体地理的经纬度详细信息
    46. * @param location 定位成功返回的对象
    47. */
    48. @Override
    49. public void onLocationReport(Location location) {
    50. try {
    51. StringBuilder stringBuilder=new StringBuilder();
    52. HiLog.error(LABEL, "定位成功" + "Latitude====>" + location.getLatitude() + "===Longitude====>" + location.getLongitude());
    53. stringBuilder.append("定位成功").append("\n");
    54. //todo 根据经纬度获取详细信息
    55. List list = geoConvert.getAddressFromLocation(location.getLatitude(), location.getLongitude(), 1);
    56. if(list.size()>0){
    57. for (int i=0;i
    58. stringBuilder.append( "Latitude====>" + list.get(i).getLatitude() ).append("\n");
    59. stringBuilder.append("Longitude====>" + list.get(i).getLongitude()).append("\n");
    60. stringBuilder.append("地理位置"+list.get(0).getDescriptions(0));
    61. HiLog.error(LABEL, "地理位置" + list.get(0).toString());
    62. //todo 显示结果
    63. getUITaskDispatcher().syncDispatch(() -> {
    64. Text_result.setText(stringBuilder.toString());
    65. });
    66. }
    67. }
    68. HiLog.error(LABEL, "geoConvert is over" );
    69. }catch (Exception e){
    70. HiLog.error(LABEL, "Exception" + e.toString());
    71. }
    72. }
    73. /**
    74. *定位的时候,定位服务状态发生改变的时候,触发这个函数
    75. * @param type 服务状态码,有如下几个状态
    76. * Locator.SESSION_START 表示定位请求已被系统接受。
    77. * Locator.SESSION_STOP 指示位置请求已完成。
    78. */
    79. @Override
    80. public void onStatusChanged(int type) {
    81. HiLog.error(LABEL,"状态改变");
    82. }
    83. /**
    84. * 定位失败触发此函数
    85. * @param type 定位失败错误码,具体状态如下
    86. * 1. Locator.ERROR_PERMISSION_NOT_GRANTED: 应用程序调用定位器接口时,尚未授予定位权限
    87. * 2.Locator.ERROR_SWITCH_UNOPEN :应用程序调用定位器接口时,位置服务已禁用(GPS 功能未打开)
    88. */
    89. @Override
    90. public void onErrorReport(int type) {
    91. HiLog.error(LABEL,"定位失败");
    92. }
    93. }
    94. }

    三、运行效果

    %E5%95%8A%E5%AE%9E%E6%89%93%E5%AE%9E%E5%A4%A7.gif

     欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

  • 相关阅读:
    猿创征文|【C++之友元函数与友元类】输出年龄
    实战系列(三)| Mybatis和MybatisPlus区别,包含详细代码
    技术分享| anyRTC服务4.3升级
    @RequestParam注解的详细介绍
    opencv之颜色空间转换(cvtColor)
    2022年11月PMP考试如何办理缓退考?攻略在这里!
    element-table + el-pagination 实现分页多选功能
    Docker中MySql容器的数据挂载
    【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成
    决策树(二):后剪枝,连续值处理,数据加载器:DataLoader和模型评估
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/126240038