[文章]儿童手表定位,活动范围监控——修改版

阅读量0
0
2
前言
为什么还会有修改版的儿童手表定位,活动范围监控呢?因为上一个项目虽然已经实现了,但是不实用。原因就是如果不是特地去查询该地方的经纬度,没有谁会准确知道这个地方的经纬度,那么就不能设定活动范围了。再者,上一个项目的活动范围设置只能是矩形范围,但是只有极少数的地方是规则的矩形范围,所以并不实用。所以针对此原因,并且对场景进行细分,有了如下两个修改版:
场景一:小孩在小区玩,家长设定活动范围即为该小区,孩子离开小区时提醒家长。
场景二:孩子和家长一起外出,家长设定孩子离自己的距离,超过该设定距离时提醒家长。
概述
场景一效果图如下:


场景二效果图如下:

----
正文一、实现场景一1. 复制上一个项目代码
创建一个名为ChildrenLocation2的Empty Java Phone应用。

按儿童手表定位,活动范围监控完善ChildrenLocation2。
2. 修改家长端设备界面布局
ability_phone.xml中编写以下代码。
删除三个文本输入框,并修改标识符id。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:height="match_parent"
  5.     ohos:width="match_parent"
  6.     ohos:alignment="top|center"
  7.     ohos:orientation="vertical">

  8.     <Text
  9.         ohos:id="$+id:Longitude"
  10.         ohos:height="match_content"
  11.         ohos:width="match_parent"
  12.         ohos:margin="10vp"
  13.         ohos:padding="10vp"
  14.         ohos:text="---"
  15.         ohos:text_size="28fp"
  16.         ohos:text_color="#000000"
  17.         ohos:text_alignment="left|vertical_center"
  18.         ohos:background_element="#78C6C5"/>

  19.     <Text
  20.         ohos:id="$+id:Latitude"
  21.         ohos:height="match_content"
  22.         ohos:width="match_parent"
  23.         ohos:margin="10vp"
  24.         ohos:padding="10vp"
  25.         ohos:text="---"
  26.         ohos:text_size="28fp"
  27.         ohos:text_color="#000000"
  28.         ohos:text_alignment="left|vertical_center"
  29.         ohos:background_element="#78C6C5"/>

  30.     <Text
  31.         ohos:id="$+id:CountryName"
  32.         ohos:height="match_content"
  33.         ohos:width="match_parent"
  34.         ohos:margin="10vp"
  35.         ohos:padding="10vp"
  36.         ohos:text="---"
  37.         ohos:text_size="28fp"
  38.         ohos:text_color="#000000"
  39.         ohos:text_alignment="left|vertical_center"
  40.         ohos:background_element="#78C6C5"/>

  41.     <Text
  42.         ohos:id="$+id:PlaceName"
  43.         ohos:height="match_content"
  44.         ohos:width="match_parent"
  45.         ohos:margin="10vp"
  46.         ohos:padding="10vp"
  47.         ohos:text="---"
  48.         ohos:text_size="28fp"
  49.         ohos:text_color="#000000"
  50.         ohos:text_alignment="left|vertical_center"
  51.         ohos:background_element="#78C6C5"
  52.         ohos:multiple_lines="true"/>

  53.     <TextField
  54.         ohos:id="$+id:tf_Location"
  55.         ohos:height="match_content"
  56.         ohos:width="match_parent"
  57.         ohos:margin="10vp"
  58.         ohos:padding="10vp"
  59.         ohos:hint="请输入活动位置......"
  60.         ohos:text_size="28fp"
  61.         ohos:text_color="#000000"
  62.         ohos:text_alignment="left|vertical_center"
  63.         ohos:background_element="#BEBEBE"
  64.         ohos:multiple_lines="true"/>

  65.     <Text
  66.         ohos:id="$+id:IDIDID"
  67.         ohos:height="match_content"
  68.         ohos:width="match_parent"
  69.         ohos:margin="10vp"
  70.         ohos:padding="10vp"
  71.         ohos:text="---"
  72.         ohos:text_size="28fp"
  73.         ohos:text_color="#000000"
  74.         ohos:text_alignment="left|vertical_center"
  75.         ohos:background_element="#78C6C5"
  76.         ohos:multiple_lines="true"/>

  77. </DirectionalLayout>
复制代码
3. 重写getRange()函数。
MainAbilitySlice.java中编写以下代码。
通过getText()方法获取设置的活动范围,通过contains()方法判断PlaceName与设置的活动范围的关系,如果PlaceName不在设置的活动范围内则通过startAbility方法播放音频,否则通过stopAbility方法停止播放音频。
  1.     private void getRange(){
  2.         TextField tf_Location = (TextField) findComponentById(ResourceTable.Id_tf_Location);

  3.         Text text = (Text) findComponentById(ResourceTable.Id_IDIDID);

  4.         String Loc = tf_Location.getText();

  5.         Intent serviceintent = new Intent();
  6.         Operation serviceOperation = new Intent.OperationBuilder()
  7.                 .withDeviceId("")
  8.                 .withBundleName(getBundleName())
  9.                 .withAbilityName(ServiceAbility.class.getName())
  10.                 .build();
  11.         serviceintent.setOperation(serviceOperation);

  12.         if(!PlaceName.equals("null")){
  13.             if(Loc.equals("")){
  14.                 text.setText("没有设定范围");
  15.                 stopAbility(serviceintent);
  16.             }else {
  17.                 if(PlaceName.contains(Loc)){
  18.                     text.setText("孩子没有超出设定范围");
  19.                     stopAbility(serviceintent);
  20.                 }else {
  21.                     text.setText("孩子已超出设定范围");
  22.                     startAbility(serviceintent);
  23.                 }
  24.             }
  25.         }else {
  26.             text.setText("无法获取孩子的位置");
  27.             stopAbility(serviceintent);
  28.         }
  29.     }
复制代码
二、实现场景二1. 复制上一个项目代码
创建一个名为ChildrenLocation3的Empty Java Phone应用。

按儿童手表定位,活动范围监控完善ChildrenLocation2。
2. 修改家长端设备界面布局
ability_phone.xml中编写以下代码。
删除三个文本输入框,并修改标识符id。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:height="match_parent"
  5.     ohos:width="match_parent"
  6.     ohos:alignment="top|center"
  7.     ohos:orientation="vertical">

  8.     <Text
  9.         ohos:id="$+id:Longitude"
  10.         ohos:height="match_content"
  11.         ohos:width="match_parent"
  12.         ohos:margin="10vp"
  13.         ohos:padding="10vp"
  14.         ohos:text="---"
  15.         ohos:text_size="28fp"
  16.         ohos:text_color="#000000"
  17.         ohos:text_alignment="left|vertical_center"
  18.         ohos:background_element="#78C6C5"/>

  19.     <Text
  20.         ohos:id="$+id:Latitude"
  21.         ohos:height="match_content"
  22.         ohos:width="match_parent"
  23.         ohos:margin="10vp"
  24.         ohos:padding="10vp"
  25.         ohos:text="---"
  26.         ohos:text_size="28fp"
  27.         ohos:text_color="#000000"
  28.         ohos:text_alignment="left|vertical_center"
  29.         ohos:background_element="#78C6C5"/>

  30.     <Text
  31.         ohos:id="$+id:CountryName"
  32.         ohos:height="match_content"
  33.         ohos:width="match_parent"
  34.         ohos:margin="10vp"
  35.         ohos:padding="10vp"
  36.         ohos:text="---"
  37.         ohos:text_size="28fp"
  38.         ohos:text_color="#000000"
  39.         ohos:text_alignment="left|vertical_center"
  40.         ohos:background_element="#78C6C5"/>

  41.     <Text
  42.         ohos:id="$+id:PlaceName"
  43.         ohos:height="match_content"
  44.         ohos:width="match_parent"
  45.         ohos:margin="10vp"
  46.         ohos:padding="10vp"
  47.         ohos:text="---"
  48.         ohos:text_size="28fp"
  49.         ohos:text_color="#000000"
  50.         ohos:text_alignment="left|vertical_center"
  51.         ohos:background_element="#78C6C5"
  52.         ohos:multiple_lines="true"/>

  53.     <TextField
  54.         ohos:id="$+id:tf_Distance"
  55.         ohos:height="match_content"
  56.         ohos:width="match_parent"
  57.         ohos:margin="10vp"
  58.         ohos:padding="10vp"
  59.         ohos:hint="请输入距离......"
  60.         ohos:text_size="28fp"
  61.         ohos:text_color="#000000"
  62.         ohos:text_alignment="left|vertical_center"
  63.         ohos:background_element="#BEBEBE"/>

  64.     <Text
  65.         ohos:id="$+id:IDIDID"
  66.         ohos:height="match_content"
  67.         ohos:width="match_parent"
  68.         ohos:margin="10vp"
  69.         ohos:padding="10vp"
  70.         ohos:text="---"
  71.         ohos:text_size="28fp"
  72.         ohos:text_color="#000000"
  73.         ohos:text_alignment="left|vertical_center"
  74.         ohos:background_element="#78C6C5"
  75.         ohos:multiple_lines="true"/>

  76. </DirectionalLayout>
复制代码
3. 重写getRange()函数。
MainAbilitySlice.java中编写以下代码。
添加两个变量Longitude_phone和Latitude_phone,并初始化为“null”,用于记录家长端设备的经纬度信息。通过location.getLongitude()方法获取经度信息,通过location.getLatitude()方法获取纬度信息。
通过getText()方法获取设置的活动距离,通过两个位置的经纬度计算其距离,并与设置的活动距离进行比较大小。根据大小关系通过startAbility方法播放音频,通过stopAbility方法停止播放音频。
  1.     private static String Longitude_phone = "null";
  2.     private static String Latitude_phone = "null";

  3.     private void getLocation(){
  4.         writeData("Longitude", Longitude);
  5.         writeData("Latitude", Latitude);
  6.         writeData("PlaceName", PlaceName);
  7.         writeData("CountryName", CountryName);

  8.         timer_phone = new Timer();
  9.         timer_phone.schedule(new TimerTask() {
  10.             @Override
  11.             public void run() {
  12.                 getUITaskDispatcher().asyncDispatch(new Runnable() {
  13.                     @Override
  14.                     public void run() {
  15.                         getRange();
  16.                         getSingleLocation();
  17.                     }
  18.                 });
  19.             }
  20.         },0,5000);
  21.     }

  22.     private void getRange(){
  23.         TextField tf_Distance = (TextField) findComponentById(ResourceTable.Id_tf_Distance);
  24.         Text text = (Text) findComponentById(ResourceTable.Id_IDIDID);
  25.         double Dis;

  26.         if(location == null){
  27.             Longitude_phone = "null";
  28.             Latitude_phone = "null";
  29.             return;
  30.         }
  31.         Longitude_phone = Double.toString(location.getLongitude());
  32.         Latitude_phone = Double.toString(location.getLatitude());

  33.         if(tf_Distance.getText().equals("")){
  34.             Dis = -1;
  35.         }else {
  36.             Dis = Double.parseDouble(tf_Distance.getText());
  37.         }

  38.         Intent serviceintent = new Intent();
  39.         Operation serviceOperation = new Intent.OperationBuilder()
  40.                 .withDeviceId("")
  41.                 .withBundleName(getBundleName())
  42.                 .withAbilityName(ServiceAbility.class.getName())
  43.                 .build();
  44.         serviceintent.setOperation(serviceOperation);

  45.         if(!(Longitude.equals("null") && Latitude.equals("null") && Longitude_phone.equals("null") && Latitude_phone.equals("null"))){
  46.             double Lon = getRadian(Double.parseDouble(Longitude));
  47.             double Lat = getRadian(Double.parseDouble(Latitude));
  48.             double Lon_phone = getRadian(Double.parseDouble(Longitude_phone));
  49.             double Lat_phone = getRadian(Double.parseDouble(Latitude_phone));

  50.             double distance = 2 * 6371.393 * 1000 * Math.asin(Math.sqrt(Math.sin((Lat_phone - Lat) / 2) * Math.sin((Lat_phone - Lat) / 2)) + Math.cos(Lat) * Math.cos(Lat_phone) * Math.sqrt(Math.sin((Lon_phone - Lon) / 2) * Math.sin((Lon_phone - Lon) / 2)));
  51.             distance = Double.parseDouble(Double.toString(distance).substring(0,7));
  52.             if(Dis != -1){
  53.                 if(distance <= Dis){
  54.                     text.setText("你距离你的孩子" + distance + "米,没有超出距离");
  55.                     stopAbility(serviceintent);
  56.                 }else {
  57.                     text.setText("你距离你的孩子" + distance + "米,已经超出距离");
  58.                     startAbility(serviceintent);
  59.                 }
  60.             }else {
  61.                 text.setText("你距离你的孩子" + distance + "米,你没有设定距离");
  62.                 stopAbility(serviceintent);
  63.             }
  64.         }else {
  65.             text.setText("没有获取位置");
  66.             stopAbility(serviceintent);
  67.         }
  68.     }

  69.     private double getRadian(double degree){//转化为弧度制
  70.         return degree / 180 * Math.PI;
  71.     }
复制代码
写在最后
更多资料请关注我们的项目 : Awesome-Harmony_木棉花
本项目会长期更新 ,希望随着鸿蒙一同成长变强的既有我们,也有正在看着这个项目的你。明年3月,深大校园内的木棉花会盛开,那时,鸿蒙也会变的更好,愿这花开,有你我的一份。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友