文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

HarmonyOS使用Java获取位置信息

2024-12-14 00:55

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

随着科技时代的发展,生活中每个人都离不开手机,当我们去一个陌生的地方,不认识路怎么办,大家都会想到手机里的百度地图、高德地图等等。生活中我们不想做饭也不想出门的时候,我们会想到美团,那么美团APP怎么知道你的位置信息呢?当你进入app时,页面中就会提示你是否允许获取位置信息,当你点击允许时,就会把位置信息展示在页面中。今天我们就来讲解一下HarmonyOS 如何使用Java UI框架获取手机位置权限并拿到位置信息。

使用DevEco Studio 创建空项目,选择java模板

File => New Project



编写基础布局

  1. "1.0" encoding="utf-8"?> 
  2.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  3.     ohos:height="match_parent" 
  4.     ohos:width="match_parent" 
  5.     ohos:alignment="top|center" 
  6.     ohos:orientation="vertical"
  7.  
  8.     
  9.         ohos:id="$+id:T_Longitude" 
  10.         ohos:height="match_content" 
  11.         ohos:width="match_parent" 
  12.         ohos:background_element="green" 
  13.         ohos:margin="10vp" 
  14.         ohos:padding="10vp" 
  15.         ohos:text="--" 
  16.         ohos:text_alignment="left|vertical_center" 
  17.         ohos:text_size="28fp"/> 
  18.     
  19.         ohos:id="$+id:T_Latitude" 
  20.         ohos:height="match_content" 
  21.         ohos:width="match_parent" 
  22.         ohos:margin="10vp" 
  23.         ohos:padding="10vp" 
  24.         ohos:background_element="green" 
  25.         ohos:text="--" 
  26.         ohos:text_alignment="left|vertical_center" 
  27.         ohos:text_size="28fp"/> 
  28.     
  29.         ohos:id="$+id:T_country" 
  30.         ohos:height="match_content" 
  31.         ohos:width="match_parent" 
  32.         ohos:margin="10vp" 
  33.         ohos:padding="10vp" 
  34.         ohos:background_element="green" 
  35.         ohos:text="--" 
  36.         ohos:text_alignment="left|vertical_center" 
  37.         ohos:text_size="28fp"/> 
  38.     
  39.         ohos:id="$+id:T_PlaceName" 
  40.         ohos:height="match_content" 
  41.         ohos:width="match_parent" 
  42.         ohos:margin="10vp" 
  43.         ohos:multiple_lines="true" 
  44.         ohos:padding="10vp" 
  45.         ohos:background_element="green" 
  46.         ohos:text="--" 
  47.         ohos:text_alignment="left|vertical_center" 
  48.         ohos:text_size="28fp"/> 
  49.     
  50.         ohos:id="$+id:btn_location" 
  51.         ohos:height="match_content" 
  52.         ohos:width="match_content" 
  53.         ohos:text="点击获取定位" 
  54.         ohos:padding="10vp" 
  55.         ohos:background_element="green" 
  56.         ohos:text_alignment="vertical_center" 
  57.         ohos:text_size="28fp"/> 
  58.  

日志工具类 LogUtil

写好布局后,我们先准备一个日志工具类,用于打印日志。

  1.  
  2. public class LogUtil { 
  3.    static HiLogLabel hiLogLabel = new HiLogLabel(HiLog.LOG_APP,233,"LOCATION_TAG"); 
  4.     public static void info(String content){ 
  5.         HiLog.info(hiLogLabel,content); 
  6.  
  7.     } public static void error(String content){ 
  8.         HiLog.info(hiLogLabel,content); 
  9.  
  10.     } public static void debug(String content){ 
  11.         HiLog.info(hiLogLabel,content); 
  12.     } 

配置位置权限 config.js

位置信息属于敏感信息,使用之前我们需要申请权限

  1. "reqPermissions": [ 
  2.      { 
  3.        "name""ohos.permission.LOCATION"
  4.        "reason"""
  5.        "usedScene": { 
  6.          "ability": ["com.example.location.MainAbility"], 
  7.          "when""inuse" 
  8.        } 
  9.      } 
  10.    ] 

MainAbility 中获取位置信息

  1. public class MainAbility extends Ability { 
  2.     Locator locator; 
  3.     MyLocatorCallback locatorCallback; 
  4.     RequestParam requestParam; 
  5.     final int REQUEST_LOCATION_CODE = 12; // 定义常量 用来表示请求码 
  6.     // 创建一个静态成员变量 数据共享 
  7.     public static Location location = null
  8.  
  9.     @Override 
  10.     public void onStart(Intent intent) { 
  11.         super.onStart(intent); 
  12.         super.setMainRoute(MainAbilitySlice.class.getName()); 
  13.         // 动态判断权限 
  14.         if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) { 
  15.             // 应用未被授予权限 
  16.             if (canRequestPermission("ohos.permission.LOCATION")) { 
  17.                 // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示) 
  18.                 requestPermissionsFromUser(new String[]{"ohos.permission.LOCATION"}, REQUEST_LOCATION_CODE); 
  19.                 LogUtil.info("canRequestPermission() running"); 
  20.             } else { 
  21.                 // 显示应用需要权限的理由,提示用户进入设置授权 
  22.                 LogUtil.info("显示应用需要权限的理由"); 
  23.             } 
  24.         } else { 
  25.             initLocator(); 
  26.             // 权限已被授予 
  27.             LogUtil.info("权限已被授予,直接启动服务"); 
  28.         } 
  29.  
  30.     } 
  31.  
  32.     @Override // 权限操作调用的方法 
  33.     public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) { 
  34.         super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults); 
  35.         switch (requestCode) { 
  36.             case REQUEST_LOCATION_CODE: { 
  37.                 // 匹配requestPermissions的requestCode 
  38.                 if (grantResults.length > 0 
  39.                         && grantResults[0] == IBundleManager.PERMISSION_GRANTED) { 
  40.                     LogUtil.info("onRequestPermissionsFromUserResult权限被授予"); 
  41.                     // 权限被授予 
  42.                     // 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理 
  43.                     initLocator(); 
  44.                 } else { 
  45.                     // 权限被拒绝 
  46.                     LogUtil.info("onRequestPermissionsFromUserResult权限被拒绝"); 
  47.                 } 
  48.                 return
  49.             } 
  50.         } 
  51.     } 
  52.  
  53.     private void initLocator() { 
  54.         locator = new Locator(this); // 创建local对象 
  55.         // 实例化RequestParam对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。 
  56.         requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION); 
  57.         // 实现 locatorCallback 接口对象 
  58.         locatorCallback = new MyLocatorCallback(); 
  59.         // locator.requestOnce(requestParam, locatorCallback); // 请求一次 
  60.         locator.startLocating(requestParam, locatorCallback); // 多次请求 直接启动服务 
  61.     } 
  62.  
  63.     @Override 
  64.     protected void onStop() { 
  65.         super.onStop(); 
  66.         locator.stopLocating(locatorCallback); // 程序结束 停止服务 
  67.     } 
  68.  
  69.     // 创建MyLocatorCallback类,实现LocatorCallback接口,用于执行定位过程的回调方法 
  70.     public class MyLocatorCallback implements LocatorCallback { 
  71.         @Override // 获取定位结果 
  72.         public void onLocationReport(Location location) { // 使用静态成员变量 进行分享 
  73.             LogUtil.info("onLocationReport:" + location.getLongitude() + "," + location.getLatitude()); 
  74.             if (location != null) { 
  75.                 MainAbility.location = location; 
  76.             } 
  77.         } 
  78.  
  79.         @Override // 获取定位过程中的状态信息 
  80.         public void onStatusChanged(int type) { 
  81.             LogUtil.info("onStatusChanged:" + type); 
  82.  
  83.         } 
  84.  
  85.         @Override // 获取定位过程中的错误信息 
  86.         public void onErrorReport(int type) { 
  87.             LogUtil.info("onErrorReport:" + type); 
  88.         } 
  89.     } 

更新视图

通过以上操作,我们拿到了位置信息,接下来我们需要把位置信息渲染到视图中

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.     Text t_Longitude; 
  3.     Text t_Latitude; 
  4.     Text t_country; 
  5.     Text t_PlaceName; 
  6.  
  7.     @Override 
  8.     public void onStart(Intent intent) { 
  9.         super.onStart(intent); 
  10.         super.setUIContent(ResourceTable.Layout_ability_main); 
  11.         // 获取UI布局中的id,用于数据绑定 
  12.         t_Longitude = (Text) findComponentById(ResourceTable.Id_T_Longitude); 
  13.         t_Latitude = (Text) findComponentById(ResourceTable.Id_T_Latitude); 
  14.         t_PlaceName = (Text) findComponentById(ResourceTable.Id_T_PlaceName); 
  15.         t_country = (Text) findComponentById(ResourceTable.Id_T_country); 
  16.  
  17.         findComponentById(ResourceTable.Id_btn_location).setClickedListener(new Component.ClickedListener() { 
  18.             @Override 
  19.             public void onClick(Component component) { 
  20.                 loadLocation(); 
  21.             } 
  22.         }); 
  23.     } 
  24.  
  25.     private void loadLocation(){ 
  26.         // 在UI线程中更新组件 
  27.         getUITaskDispatcher().asyncDispatch(new Runnable() { 
  28.             @Override 
  29.             public void run() { 
  30.                 // 是UI中的操作 
  31.                 if(location == null)return
  32.                 t_Longitude.setText("经度:"+location.getLongitude() +""); 
  33.                 t_Latitude.setText("纬度:"+location.getLatitude() +""); 
  34.                 // (逆)地理编码转换 
  35.                 GeoConvert geoConvert = new GeoConvert(); 
  36.                 try { 
  37.                     List list = geoConvert.getAddressFromLocation(location.getLatitude(),location.getLongitude(),1); 
  38.                     GeoAddress geoAddress = list.get(0); 
  39.                     if(geoAddress == nullreturn
  40.                     t_PlaceName.setText("位置:"+geoAddress.getPlaceName()+""); 
  41.                     t_country.setText("国家:"+geoAddress.getCountryName()+""); 
  42.                 } catch (IOException e) { 
  43.                     e.printStackTrace(); 
  44.                 } 
  45.             } 
  46.         }); 
  47.     } 
  48.  
  49.     @Override 
  50.     public void onActive() { 
  51.         super.onActive(); 
  52.     } 
  53.  
  54.     @Override 
  55.     public void onForeground(Intent intent) { 
  56.         super.onForeground(intent); 
  57.     } 

实现效果图如下:


想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯