IT科技类资讯

HarmonyOS使用Java获取位置信息

时间:2010-12-5 17:23:32  作者:应用开发   来源:数据库  查看:  评论:0
内容摘要:想了解更多内容,请访问:和华为官方合作共建的鸿蒙技术社区https://harmonyos.51cto.com前言随着科技时代的发展,生活中每个人都离不开手机,当我们去一个陌生的地方,不认识路怎么办,

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

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

https://harmonyos.51cto.com

前言

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

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

File => New Project

编写基础布局

<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout     xmlns:ohos="http://schemas.huawei.com/res/ohos"     ohos:height="match_parent"     ohos:width="match_parent"     ohos:alignment="top|center"     ohos:orientation="vertical">      <Text         ohos:id="$+id:T_Longitude"         ohos:height="match_content"         ohos:width="match_parent"         ohos:background_element="green"         ohos:margin="10vp"         ohos:padding="10vp"         ohos:text="--"         ohos:text_alignment="left|vertical_center"         ohos:text_size="28fp"/>     <Text         ohos:id="$+id:T_Latitude"         ohos:height="match_content"         ohos:width="match_parent"         ohos:margin="10vp"         ohos:padding="10vp"         ohos:background_element="green"         ohos:text="--"         ohos:text_alignment="left|vertical_center"         ohos:text_size="28fp"/>     <Text         ohos:id="$+id:T_country"         ohos:height="match_content"         ohos:width="match_parent"         ohos:margin="10vp"         ohos:padding="10vp"         ohos:background_element="green"         ohos:text="--"         ohos:text_alignment="left|vertical_center"         ohos:text_size="28fp"/>     <Text         ohos:id="$+id:T_PlaceName"         ohos:height="match_content"         ohos:width="match_parent"         ohos:margin="10vp"         ohos:multiple_lines="true"         ohos:padding="10vp"         ohos:background_element="green"         ohos:text="--"         ohos:text_alignment="left|vertical_center"         ohos:text_size="28fp"/>     <Button         ohos:id="$+id:btn_location"         ohos:height="match_content"         ohos:width="match_content"         ohos:text="点击获取定位"         ohos:padding="10vp"         ohos:background_element="green"         ohos:text_alignment="vertical_center"         ohos:text_size="28fp"/> </DirectionalLayout> 

日志工具类 LogUtil

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

/**  *日志工具类  */ public class LogUtil {     static HiLogLabel hiLogLabel = new HiLogLabel(HiLog.LOG_APP,233,"LOCATION_TAG");     public static void info(String content){          HiLog.info(hiLogLabel,content);      } public static void error(String content){          HiLog.info(hiLogLabel,content);      } public static void debug(String content){          HiLog.info(hiLogLabel,content);     } } 

配置位置权限 config.js

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

"reqPermissions": [      {         "name": "ohos.permission.LOCATION",        "reason": "",        "usedScene": {           "ability": ["com.example.location.MainAbility"],          "when": "inuse"        }      }    ] 

MainAbility 中获取位置信息

public class MainAbility extends Ability {      Locator locator;     MyLocatorCallback locatorCallback;     RequestParam requestParam;     final int REQUEST_LOCATION_CODE = 12; // 定义常量 用来表示请求码     // 创建一个静态成员变量 数据共享     public static Location location = null;      @Override     public void onStart(Intent intent) {          super.onStart(intent);         super.setMainRoute(MainAbilitySlice.class.getName());         // 动态判断权限         if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) {              // 应用未被授予权限             if (canRequestPermission("ohos.permission.LOCATION")) {                  // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)                 requestPermissionsFromUser(new String[]{ "ohos.permission.LOCATION"}, REQUEST_LOCATION_CODE);                 LogUtil.info("canRequestPermission() running");             } else {                  // 显示应用需要权限的理由,提示用户进入设置授权                 LogUtil.info("显示应用需要权限的理由");             }         } else {              initLocator();             // 权限已被授予             LogUtil.info("权限已被授予,直接启动服务");         }      }      @Override // 权限操作调用的方法     public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {          super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);         switch (requestCode) {              case REQUEST_LOCATION_CODE: {                  // 匹配requestPermissions的requestCode                 if (grantResults.length > 0                         && grantResults[0] == IBundleManager.PERMISSION_GRANTED) {                      LogUtil.info("onRequestPermissionsFromUserResult权限被授予");                     // 权限被授予                     // 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的云服务器接口进行异常捕获处理                     initLocator();                 } else {                      // 权限被拒绝                     LogUtil.info("onRequestPermissionsFromUserResult权限被拒绝");                 }                 return;             }         }     }      private void initLocator() {          locator = new Locator(this); // 创建local对象         // 实例化RequestParam对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。         requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);         // 实现 locatorCallback 接口对象         locatorCallback = new MyLocatorCallback();         // locator.requestOnce(requestParam, locatorCallback); // 请求一次         locator.startLocating(requestParam, locatorCallback); // 多次请求 直接启动服务     }      @Override     protected void onStop() {          super.onStop();         locator.stopLocating(locatorCallback); // 程序结束 停止服务     }      // 创建MyLocatorCallback类,实现LocatorCallback接口,用于执行定位过程的回调方法     public class MyLocatorCallback implements LocatorCallback {          @Override // 获取定位结果         public void onLocationReport(Location location) {  // 使用静态成员变量 进行分享             LogUtil.info("onLocationReport:" + location.getLongitude() + "," + location.getLatitude());             if (location != null) {                  MainAbility.location = location;             }         }          @Override // 获取定位过程中的状态信息         public void onStatusChanged(int type) {              LogUtil.info("onStatusChanged:" + type);          }          @Override // 获取定位过程中的错误信息         public void onErrorReport(int type) {              LogUtil.info("onErrorReport:" + type);         }     } } 

更新视图

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

public class MainAbilitySlice extends AbilitySlice {      Text t_Longitude;     Text t_Latitude;     Text t_country;     Text t_PlaceName;      @Override     public void onStart(Intent intent) {          super.onStart(intent);         super.setUIContent(ResourceTable.Layout_ability_main);         // 获取UI布局中的id,用于数据绑定         t_Longitude = (Text) findComponentById(ResourceTable.Id_T_Longitude);         t_Latitude = (Text) findComponentById(ResourceTable.Id_T_Latitude);         t_PlaceName = (Text) findComponentById(ResourceTable.Id_T_PlaceName);         t_country = (Text) findComponentById(ResourceTable.Id_T_country);          findComponentById(ResourceTable.Id_btn_location).setClickedListener(new Component.ClickedListener() {              @Override             public void onClick(Component component) {                  loadLocation();             }         });     }      private void loadLocation(){          // 在UI线程中更新组件         getUITaskDispatcher().asyncDispatch(new Runnable() {              @Override             public void run() {                  // 是UI中的操作                 if(location == null)return;                 t_Longitude.setText("经度:"+location.getLongitude() +"");                 t_Latitude.setText("纬度:"+location.getLatitude() +"");                 // (逆)地理编码转换                 GeoConvert geoConvert = new GeoConvert();                 try {                      List<GeoAddress> list = geoConvert.getAddressFromLocation(location.getLatitude(),location.getLongitude(),1);                     GeoAddress geoAddress = list.get(0);                     if(geoAddress == null) return;                     t_PlaceName.setText("位置:"+geoAddress.getPlaceName()+"");                     t_country.setText("国家:"+geoAddress.getCountryName()+"");                 } catch (IOException e) {                      e.printStackTrace();                 }             }         });     }      @Override     public void onActive() {          super.onActive();     }      @Override     public void onForeground(Intent intent) {          super.onForeground(intent);     } } 

实现效果图如下:

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

和华为官方合作共建的源码库鸿蒙技术社区

https://harmonyos.51cto.com

-->
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap