[文章]【木棉花】儿童手表定位,活动范围监控

阅读量0
0
3
前言
场景设想:孩子戴着手表去上补习班、在小区内玩耍等等,手表可以将实时位置发送给家长,超出设置的活动范围内时提醒家长,实现孩子安全防患于未然。
本次项目由于缺少鸿蒙手表设备,故用手机或平板替代。
概述
孩子端设备界面如下,每隔五秒钟将实时位置发送给家长端设备:

家长端设备每隔五秒钟将孩子端设备的实时位置显示出来:

孩子端设备不在设定的经纬度范围时会显示“孩子已超出设定范围”,并发出声音提醒家长:

孩子端设备在设定的经纬度范围时会显示“孩子没有超出设定范围”,并停止发出声音:

当没有设定范围或设定的经纬度范围不合理时即经度小于0°大于180°,纬度小于0°大于90°时,显示“没有设定范围或者输入的经度不在0到180之间、输入的纬度不在0到90之间”:
正文一、创建一个空白的工程1. 安装和配置DevEco Studio 2.1 Release
DevEco Studio 2.1 Release下载、DevEco Studio 2.1 Release安装
2. 创建一个Empty Java Phone应用
DevEco Studio下载安装成功后,打开DevEco Studio,点击左上角的File,点击New,再选择New Project,选择Empty Ability(Java)选项,点击Next按钮。

将文件命名为ChildrenLocation(文件名不能出现中文或者特殊字符,否则将无法成功创建项目文件),选择保存路径,选择API5,设备勾选Phone、Tablet,最后点击Finish按钮。
3. 准备工作
entry>src>main>config.json文件中最下方"launchType": "standard"的后面添加以下代码,这样就可以实现去掉应用上方的标签栏了。
config.json最下方部分代码:
  1.         "orientation": "unspecified",
  2.         "name": "com.test.qixifestival.MainAbility",
  3.         "icon": "$media:icon",
  4.         "description": "$string:mainability_description",
  5.         "label": "$string:entry_MainAbility",
  6.         "type": "page",
  7.         "launchType": "standard",
  8.         "metaData": {
  9.           "customizeData": [
  10.             {
  11.               "name": "hwc-theme",
  12.               "value": "androidhwext:style/Theme.Emui.Light.NoTitleBar",
  13.               "extra": ""
  14.             }
  15.           ]
  16.         }
  17.       }
  18.     ]
  19.   }
  20. }
复制代码
二、实现界面布局1. 孩子端设备界面
ChildrenLocation>entry>src>main>resources>base>layout>ability_main.xml添加布局代码。
删除已有的Text组件。
  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="center"
  7.     ohos:orientation="vertical">

  8. </DirectionalLayout>
复制代码
添加一个名为ability_wearable.xml布局文件,布局代码如下,将相应图片文件放到文件夹media中,并且命名为image。
  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:orientation="vertical">

  7.     <Image
  8.         ohos:height="match_parent"
  9.         ohos:width="match_parent"
  10.         ohos:image_src="$media:image"
  11.         ohos:layout_alignment="center"/>

  12. </DirectionalLayout>
复制代码
2. 家长端设备界面
添加一个名为ability_phone.xml布局文件,布局代码如下。
  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="3vp"
  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="3vp"
  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="3vp"
  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="3vp"
  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_MinLongitude"
  55.         ohos:height="match_content"
  56.         ohos:width="match_parent"
  57.         ohos:margin="10vp"
  58.         ohos:padding="3vp"
  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.     <TextField
  65.         ohos:id="$+id:tf_MaxLongitude"
  66.         ohos:height="match_content"
  67.         ohos:width="match_parent"
  68.         ohos:margin="10vp"
  69.         ohos:padding="3vp"
  70.         ohos:hint="请输入最大经度......"
  71.         ohos:text_size="28fp"
  72.         ohos:text_color="#000000"
  73.         ohos:text_alignment="left|vertical_center"
  74.         ohos:background_element="#BEBEBE"/>

  75.     <TextField
  76.         ohos:id="$+id:tf_MinLatitude"
  77.         ohos:height="match_content"
  78.         ohos:width="match_parent"
  79.         ohos:margin="10vp"
  80.         ohos:padding="3vp"
  81.         ohos:hint="请输入最小纬度......"
  82.         ohos:text_size="28fp"
  83.         ohos:text_color="#000000"
  84.         ohos:text_alignment="left|vertical_center"
  85.         ohos:background_element="#BEBEBE"/>

  86.     <TextField
  87.         ohos:id="$+id:tf_MaxLatitude"
  88.         ohos:height="match_content"
  89.         ohos:width="match_parent"
  90.         ohos:margin="10vp"
  91.         ohos:padding="3vp"
  92.         ohos:hint="请输入最大纬度......"
  93.         ohos:text_size="28fp"
  94.         ohos:text_color="#000000"
  95.         ohos:text_alignment="left|vertical_center"
  96.         ohos:background_element="#BEBEBE"/>

  97.     <Text
  98.         ohos:id="$+id:IDIDID"
  99.         ohos:height="match_content"
  100.         ohos:width="match_parent"
  101.         ohos:margin="10vp"
  102.         ohos:padding="3vp"
  103.         ohos:text="---"
  104.         ohos:text_size="28fp"
  105.         ohos:text_color="#000000"
  106.         ohos:text_alignment="left|vertical_center"
  107.         ohos:background_element="#78C6C5"
  108.         ohos:multiple_lines="true"/>

  109. </DirectionalLayout>
复制代码
ChildrenLocation>entry>src>main>java>com.test.qixifestival>slice>MainAbilitySlice.java编写以下代码。
1)如果是不同类型的设备,例如手机和平板,那可以根据设备类型来区分家长端和孩子端。
2)如果是相同类型不同型号的设备,例如HUAWEI P40和nova 5 Pro,那可以根据设备型号来区分家长端和孩子端。
3)如果是相同类型相同型号的设备,那只能根据设备的id来区分家长端和孩子端,但是不推荐此方法。
  1.     public void onStart(Intent intent) {
  2.         super.onStart(intent);
  3.         //1)根据设备类型来区分家长端和孩子端
  4.         /*String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getType();
  5.         if(s.equals("14")){
  6.             super.setUIContent(ResourceTable.Layout_ability_phone);
  7.         }else{
  8.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  9.         }*/
  10.         //2)根据设备型号来区分家长端和孩子端
  11.         String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getName();
  12.         if(s.equals("HUAWEI P40")){
  13.             super.setUIContent(ResourceTable.Layout_ability_phone);
  14.         }else{
  15.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  16.         }
  17.         //3)根据设备的id来区分家长端和孩子端
  18.         /*String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getId();
  19.         if(s.equals("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")){
  20.             super.setUIContent(ResourceTable.Layout_ability_phone);
  21.         }else{
  22.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  23.         }*/
  24.     }
复制代码
三、获取孩子端设备实时位置1. 添加权限
config.json添加权限。
  1. "reqPermissions": [
  2.       {
  3.         "name": "ohos.permission.LOCATION"
  4.       }
  5.     ]
复制代码
2. 获取孩子端位置
MainAbility.java中动态获取权限,并创建一个静态成员变量用于获取位置信息。
  1. public class MainAbility extends Ability {
  2.     Locator locator;
  3.     MyLocatorCallback locatorCallback;
  4.     RequestParam requestParam;
  5.     public static Location location = null;

  6.     public void onStart(Intent intent) {
  7.         super.onStart(intent);
  8.         super.setMainRoute(MainAbilitySlice.class.getName());

  9.        // 动态判断权限
  10.         if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) {
  11.             // 应用未被授予权限
  12.             if (canRequestPermission("ohos.permission.LOCATION")) {
  13.                 // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
  14.                 requestPermissionsFromUser(new String[]{"ohos.permission.LOCATION"}, 0);
  15.             }
  16.         } else {
  17.             initLocator();
  18.         }

  19.     }

  20.     private void initLocator() {
  21.         locator = new Locator(this);
  22.         requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);
  23.         locatorCallback = new MyLocatorCallback();
  24.         locator.startLocating(requestParam, locatorCallback);
  25.     }

  26.     @Override
  27.     protected void onStop() {
  28.         super.onStop();
  29.         locator.stopLocating(locatorCallback);
  30.     }
  31.    
  32.     public class MyLocatorCallback implements LocatorCallback {//获取定位信息
  33.         [url=home.php?mod=space&uid=2735960]@Override[/url]
  34.         public void onLocationReport(Location location) {
  35.             if (location != null) {
  36.                 MainAbility.location = location;
  37.             }
  38.         }

  39.         @Override
  40.         public void onStatusChanged(int type) {
  41.             
  42.         }

  43.         @Override
  44.         public void onErrorReport(int type) {

  45.         }
  46.     }
  47. }
复制代码
3. 添加一个分布式数据库
config.json添加权限。
  1.     "reqPermissions": [
  2.       {
  3.         "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  4.       },
  5.       {
  6.         "name": "ohos.permission.LOCATION"
  7.       }
  8.     ]
复制代码
MainAbility.java中动态申请权限。
  1.     public void onStart(Intent intent) {
  2.         super.onStart(intent);
  3.         super.setMainRoute(MainAbilitySlice.class.getName());

  4.        // 动态判断权限
  5.         if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED || verifySelfPermission("ohos.permission.DISTRIBUTED_DATASYNC") != IBundleManager.PERMISSION_GRANTED) {
  6.             // 应用未被授予权限
  7.             if (canRequestPermission("ohos.permission.LOCATION") || canRequestPermission("ohos.permission.DISTRIBUTED_DATASYNC")) {
  8.                 // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
  9.                 requestPermissionsFromUser(new String[]{"ohos.permission.LOCATION", "ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
  10.             }
  11.         } else {
  12.             initLocator();
  13.         }

  14.     }
复制代码
MainAbilitySlice.java中编写以下代码。
添加四个变量Longitude、Latitude、PlaceName和CountryName,并初始化为“null”。
创建分布式数据库管理器实例KvManager,并借助KvManager创建SINGLE_VERSION分布式数据库,最后订阅分布式数据库中数据变化。
  1.     public static final String STORE_ID = "contact_db1";//分布式数据库标识
  2.     public static SingleKvStore singleKvStore;
  3.     public static KvManager kvManager;

  4.     private static String Longitude = "null";
  5.     private static String Latitude = "null";
  6.     private static String PlaceName = "null";
  7.     private static String CountryName = "null";

  8.     public void initDbManager() {
  9.         kvManager = createManager();
  10.         singleKvStore = createDb(kvManager);
  11.         subscribeDb(singleKvStore);
  12.     }

  13.     public KvManager createManager() {//创建分布式数据库管理器实例KvManager
  14.         KvManager manager = null;
  15.         try {
  16.             KvManagerConfig config = new KvManagerConfig(this);
  17.             manager = KvManagerFactory.getInstance().createKvManager(config);
  18.         }
  19.         catch (KvStoreException exception) {

  20.         }
  21.         return manager;
  22.     }

  23.     private SingleKvStore createDb(KvManager kvManager) {//借助KvManager创建SINGLE_VERSION分布式数据库
  24.         SingleKvStore kvStore = null;
  25.         try {
  26.             Options options = new Options();
  27.             options.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION);
  28.             kvStore = kvManager.getKvStore(options, STORE_ID);
  29.         } catch (KvStoreException exception) {

  30.         }
  31.         return kvStore;
  32.     }

  33.     private void subscribeDb(SingleKvStore singleKvStore) {//订阅分布式数据库中数据变化
  34.         class KvStoreObserverClient implements KvStoreObserver {
  35.             @Override
  36.             public void onChange(ChangeNotification notification) {
  37.                 Longitude = queryContact("Longitude");
  38.                 Latitude = queryContact("Latitude");
  39.                 PlaceName = queryContact("PlaceName");
  40.                 CountryName = queryContact("CountryName");
  41.             }
  42.         }

  43.         KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();
  44.         singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient);
  45.     }

  46.     public static void writeData(String key, String value) {//数据插入
  47.         if (key == null || key.isEmpty() || value == null || value.isEmpty()) {
  48.             return;
  49.         }
  50.         singleKvStore.putString(key, value);
  51.     }

  52.     public static String queryContact(String key) {//数据查询
  53.         String value = singleKvStore.getString(key);

  54.         return value;
  55.     }
复制代码
4. 将实时位置写入分布式数据库中
通过location.getLongitude()方法获取经度,location.getLatitude()方法获取纬度,geoAddress.getPlaceName()方法获取位置,geoAddress.getCountryName()方法获取国家。
创建时间任务,每隔五秒钟获取一次孩子端设备位置信息,并将信息写入分布式数据库中。
  1. import static com.test.childrenlocation.MainAbility.location;

  2.     private Timer timer_wearable;

  3.     public void onStart(Intent intent) {
  4.         super.onStart(intent);
  5.         //1)根据设备类型来区分家长端和孩子端
  6.         /*String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getType();
  7.         if(s.equals("14")){
  8.             super.setUIContent(ResourceTable.Layout_ability_phone);
  9.         }else{
  10.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  11.         }*/
  12.         //2)根据设备型号来区分家长端和孩子端
  13.         String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getName();
  14.         initDbManager();
  15.         if(s.equals("HUAWEI P40")){
  16.             super.setUIContent(ResourceTable.Layout_ability_phone);
  17.         }else{
  18.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  19.             setLocation();
  20.         }
  21.         //3)根据设备的id来区分家长端和孩子端
  22.         /*String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getId();
  23.         if(s.equals("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")){
  24.             super.setUIContent(ResourceTable.Layout_ability_phone);
  25.         }else{
  26.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  27.         }*/
  28.     }

  29.     private void setLocation(){
  30.         timer_wearable = new Timer();
  31.         timer_wearable.schedule(new TimerTask() {
  32.             @Override
  33.             public void run() {
  34.                 getUITaskDispatcher().asyncDispatch(new Runnable() {
  35.                     @Override
  36.                     public void run() {
  37.                         setSingleLocation();
  38.                         writeData("Longitude", Longitude);
  39.                         writeData("Latitude", Latitude);
  40.                         writeData("PlaceName", PlaceName);
  41.                         writeData("CountryName", CountryName);
  42.                     }
  43.                 });
  44.             }
  45.         }, 0, 5000);
  46.     }

  47.     private void setSingleLocation(){
  48.         if(location == null){
  49.             Longitude = "null";
  50.             Latitude = "null";
  51.             return;
  52.         }
  53.         Longitude = Double.toString(location.getLongitude());
  54.         Latitude = Double.toString(location.getLatitude());
  55.         GeoConvert geoConvert = new GeoConvert();
  56.         try {
  57.             List<GeoAddress> list = geoConvert.getAddressFromLocation(location.getLatitude(),location.getLongitude(),1);
  58.             GeoAddress geoAddress = list.get(0);
  59.             if(geoAddress == null){
  60.                 PlaceName = "null";
  61.                 CountryName = "null";
  62.                 return;
  63.             }
  64.             PlaceName = geoAddress.getPlaceName();
  65.             CountryName = geoAddress.getCountryName();
  66.         } catch (IOException e) {
  67.             e.printStackTrace();
  68.         }
  69.     }
复制代码
四、显示孩子端设备实时信息1. 通过service播放声音
添加一个ServiceAbility.java,将音频文件放到文件夹rawfile中,并命名为text.mp3。在onStart中播放音频,在onStop中停止播放音频。
  1. public class ServiceAbility extends Ability {
  2.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");
  3.     private Player player = new Player(this);

  4.     @Override
  5.     public void onStart(Intent intent) {
  6.         HiLog.error(LABEL_LOG, "ServiceAbility::onStart");
  7.         super.onStart(intent);

  8.         EventRunner eventRunner =EventRunner.create(true);
  9.         EventHandler eventHandler = new EventHandler(eventRunner);
  10.         eventHandler.postSyncTask(new Runnable() {
  11.             @Override
  12.             public void run() {
  13.                 try{
  14.                     RawFileDescriptor rawFileDescriptor = getResourceManager()
  15.                             .getRawFileEntry("resources/rawfile/text.mp3")
  16.                             .openRawFileDescriptor();
  17.                     Source source = new Source(rawFileDescriptor.getFileDescriptor(),
  18.                             rawFileDescriptor.getStartPosition(),
  19.                             rawFileDescriptor.getFileSize());
  20.                     player.setSource(source);
  21.                     player.prepare();
  22.                     player.play();
  23.                 } catch (IOException e) {
  24.                     e.printStackTrace();
  25.                 }
  26.             }
  27.         });
  28.     }

  29.     @Override
  30.     public void onBackground() {
  31.         super.onBackground();
  32.         HiLog.info(LABEL_LOG, "ServiceAbility::onBackground");
  33.     }

  34.     @Override
  35.     public void onStop() {
  36.         super.onStop();
  37.         HiLog.info(LABEL_LOG, "ServiceAbility::onStop");

  38.         if(player.isNowPlaying()){
  39.             player.stop();
  40.             player.release();
  41.         }
  42.     }

  43.     @Override
  44.     public void onCommand(Intent intent, boolean restart, int startId) {
  45.     }

  46.     @Override
  47.     public IRemoteObject onConnect(Intent intent) {
  48.         return null;
  49.     }

  50.     @Override
  51.     public void onDisconnect(Intent intent) {
  52.     }
  53. }
复制代码
2. 显示实时位置
在MainAbilitySlice.java中编写以下代码。
通过查询分布式数据库中的key值得到孩子端设备实时位置信息,并写到文本中。
  1.     private void getSingleLocation(){
  2.         Text text_Longitude = (Text) findComponentById(ResourceTable.Id_Longitude);
  3.         Text text_Latitude = (Text) findComponentById(ResourceTable.Id_Latitude);
  4.         Text text_PlaceName = (Text) findComponentById(ResourceTable.Id_PlaceName);
  5.         Text text_CountryName = (Text) findComponentById(ResourceTable.Id_CountryName);

  6.         Longitude = queryContact("Longitude");
  7.         Latitude = queryContact("Latitude");
  8.         PlaceName = queryContact("PlaceName");
  9.         CountryName = queryContact("CountryName");

  10.         text_Longitude.setText("经度:" + Longitude);
  11.         text_Latitude.setText("纬度:" + Latitude);
  12.         text_PlaceName.setText("位置:" + PlaceName);
  13.         text_CountryName.setText("国家:" + CountryName);
  14.     }
复制代码
3. 添加活动范围监听事件
从四个文本输入框中获取设定的位置范围,并与实时位置判断,如果超出设定的位置范围则通过startAbility方法播放音频,否则通过stopAbility方法停止播放音频。
  1.     private Timer timer_phone;

  2.     public void onStart(Intent intent) {
  3.         super.onStart(intent);
  4.         //1)根据设备类型来区分家长端和孩子端
  5.         /*String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getType();
  6.         if(s.equals("14")){
  7.             super.setUIContent(ResourceTable.Layout_ability_phone);
  8.         }else{
  9.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  10.         }*/
  11.         //2)根据设备型号来区分家长端和孩子端
  12.         String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getName();
  13.         initDbManager();
  14.         if(s.equals("HUAWEI P40")){
  15.             super.setUIContent(ResourceTable.Layout_ability_phone);
  16.             getLocation();
  17.         }else{
  18.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  19.             setLocation();
  20.         }
  21.         //3)根据设备的id来区分家长端和孩子端
  22.         /*String s = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this)).getLocalDeviceInfo().getId();
  23.         if(s.equals("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")){
  24.             super.setUIContent(ResourceTable.Layout_ability_phone);
  25.         }else{
  26.             super.setUIContent(ResourceTable.Layout_ability_wearable);
  27.         }*/
  28.     }

  29.     private void getLocation(){
  30.         writeData("Longitude", Longitude);
  31.         writeData("Latitude", Latitude);
  32.         writeData("PlaceName", PlaceName);
  33.         writeData("CountryName", CountryName);

  34.         timer_phone = new Timer();
  35.         timer_phone.schedule(new TimerTask() {
  36.             @Override
  37.             public void run() {
  38.                 getUITaskDispatcher().asyncDispatch(new Runnable() {
  39.                     @Override
  40.                     public void run() {
  41.                         getSingleLocation();
  42.                         getRange();
  43.                     }
  44.                 });
  45.             }
  46.         },0,5000);
  47.     }

  48.     private void getSingleLocation(){
  49.         Text text_Longitude = (Text) findComponentById(ResourceTable.Id_Longitude);
  50.         Text text_Latitude = (Text) findComponentById(ResourceTable.Id_Latitude);
  51.         Text text_PlaceName = (Text) findComponentById(ResourceTable.Id_PlaceName);
  52.         Text text_CountryName = (Text) findComponentById(ResourceTable.Id_CountryName);

  53.         Longitude = queryContact("Longitude");
  54.         Latitude = queryContact("Latitude");
  55.         PlaceName = queryContact("PlaceName");
  56.         CountryName = queryContact("CountryName");

  57.         text_Longitude.setText("经度:" + Longitude);
  58.         text_Latitude.setText("纬度:" + Latitude);
  59.         text_PlaceName.setText("位置:" + PlaceName);
  60.         text_CountryName.setText("国家:" + CountryName);
  61.     }

  62.     private void getRange(){
  63.         TextField tf_MinLongitude = (TextField) findComponentById(ResourceTable.Id_tf_MinLongitude);
  64.         TextField tf_MaxLongitude = (TextField) findComponentById(ResourceTable.Id_tf_MaxLongitude);
  65.         TextField tf_MinLatitude = (TextField) findComponentById(ResourceTable.Id_tf_MinLatitude);
  66.         TextField tf_MaxLatitude = (TextField) findComponentById(ResourceTable.Id_tf_MaxLatitude);

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

  68.         double MinLongitude;
  69.         double MaxLongitude;
  70.         double MinLatitude;
  71.         double MaxLatitude;
  72.         double Lon;
  73.         double Lat;

  74.         if(tf_MinLongitude.getText().equals("")){
  75.             MinLongitude = 190;
  76.         }else {
  77.             MinLongitude = Double.parseDouble(tf_MinLongitude.getText());
  78.         }

  79.         if(tf_MaxLongitude.getText().equals("")){
  80.             MaxLongitude = 190;
  81.         }else {
  82.             MaxLongitude = Double.valueOf(tf_MaxLongitude.getText());
  83.         }

  84.         if(tf_MinLatitude.getText().equals("")){
  85.             MinLatitude = 190;
  86.         }else {
  87.             MinLatitude = Double.valueOf(tf_MinLatitude.getText());
  88.         }

  89.         if(tf_MaxLatitude.getText().equals("")){
  90.             MaxLatitude = 190;
  91.         }else {
  92.             MaxLatitude = Double.valueOf(tf_MaxLatitude.getText());
  93.         }

  94.         Intent serviceintent = new Intent();
  95.         Operation serviceOperation = new Intent.OperationBuilder()
  96.                 .withDeviceId("")
  97.                 .withBundleName(getBundleName())
  98.                 .withAbilityName(ServiceAbility.class.getName())
  99.                 .build();
  100.         serviceintent.setOperation(serviceOperation);

  101.         if(!(Longitude.equals("null") && Latitude.equals("null"))){
  102.             Lon = Double.valueOf(Longitude);
  103.             Lat = Double.valueOf(Latitude);
  104.             if(0 <= MinLongitude && MinLongitude <= 180 && 0 <= MaxLongitude && MaxLongitude <= 180 && 0 <= MinLatitude && MinLatitude <= 90 && 0 <= MaxLatitude && MaxLatitude <= 930){
  105.                 if(!(MinLongitude <= Lon && Lon <= MaxLongitude && MinLatitude <= Lat && Lat <= MaxLatitude)){
  106.                     text.setText("孩子已超出设定范围");
  107.                     startAbility(serviceintent);
  108.                 }else{
  109.                     text.setText("孩子没有超出设定范围");
  110.                     stopAbility(serviceintent);
  111.                 }
  112.             }else {
  113.                 text.setText("没有设定范围或者输入的经度不在0到180之间、输入的纬度不在0到90之间");
  114.                 stopAbility(serviceintent);
  115.             }
  116.         }else {
  117.             text.setText("无法获取孩子的位置");
  118.             stopAbility(serviceintent);
  119.         }
  120.     }
复制代码
写在最后
更多资料请关注我们的项目 : Awesome-Harmony_木棉花
本项目会长期更新 ,希望随着鸿蒙一同成长变强的既有我们,也有正在看着这个项目的你。明年3月,深大校园内的木棉花会盛开,那时,鸿蒙也会变的更好,愿这花开,有你我的一份。

回帖

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