地理围栏API服务开发

要使用华为地理围栏服务API,需要确保设备已经下载并安装了HMS Core(APK),并将Location Kit的SDK集成到项目中。

指定应用权限

  • 如果需要使用地理围栏服务API,需要在“AndroidManifest.xml”文件中申请ACCESS_FINE_LOCATION权限和ACCESS_COARSE_LOCATION权限:
  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  • 在Android Q版本中,需要在“AndroidManifest.xml”文件中申请ACCESS_BACKGROUND_LOCATION权限:

.          <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

说明

以上地理围栏相关权限属于危险权限,使用时需要动态申请。

注册静态广播

地理围栏触发信息通过广播接收,需要在Manifest文件中注册广播接收器。

  1. <!--注册地理围栏服务广播接收器-->
  2. <receiver
  3. android:name=".geofence.GeoFenceBroadcastReceiver"
  4. android:exported="true">
  5. <intent-filter>
  6. <action android:name="com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION" />
  7. </intent-filter>
  8. </receiver>

创建地理围栏服务客户端

在Activity的OnCreate()方法中创建GeofenceService实例,并使用该实例调用与geofence相关的API接口。

  1. private GeofenceService geofenceService;
  2. private ArrayList<String> idList;
  3. private ArrayList<Geofence> geofenceList;
  4. private String TAG;
  5. private PendingIntent pendingIntent;
  6. protected void onCreate(Bundle savedInstanceState) {
  7. // 创建一个新的GeofenceService实例
  8. geofenceService = LocationServices.getGeofenceService(this);
  9. // 获取PendingIntent对象
  10. 10.     pendingIntent = getPendingIntent();
  11. 11.     idList = new ArrayList<String>();
  12. 12.     geofenceList = new ArrayList<Geofence>();
  13. 13.     TAG = "geoFence";

14. }

创建并添加地理围栏

可以先创建地理围栏实例,并构建添加地理围栏的请求。在发送请求之后,会通过Task通知是否添加成功。

  1. 创建地理围栏实例。
  2. geofenceList.add(new Geofence.Builder()
  3. .setUniqueId("mGeofence")
  4. .setValidContinueTime(10000)
  5. // 传入经纬度信息,圆形地理围栏半径(单位:米)
  6. .setRoundArea(latitude, longitude, radius)
  7. // 进入或退出围栏时触发回调
  8. .setConversions(Geofence.ENTER_GEOFENCE_CONVERSION | Geofence.EXIT_GEOFENCE_CONVERSION)
  9. .build());
  10. idList.add("mGeofence");
  11. 创建添加地理围栏的请求。
  12. private GeofenceRequest getAddGeofenceRequest() {
  13. GeofenceRequest.Builder builder = new GeofenceRequest.Builder();
  14. // 当用户在围栏中时,添加围栏后立即触发回调
  15. builder.setInitConversions(GeofenceRequest.ENTER_INIT_CONVERSION);
  16. builder.createGeofenceList(geofenceList);
  17. return builder.build();
  18. }
  19. 动态注册GeoFenceBroadcastReceiver广播接收器。
  20. // 通过PendingIntent动态注册GeoFenceBroadcastReceiver广播接收器,当触发围栏的时候,会通过广播通知。
  21. private PendingIntent getPendingIntent() {
  22. Intent intent = new Intent(this, GeoFenceBroadcastReceiver.class);
  23. intent.setAction(GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION);
  24. return PendingIntent.getBroadcast(this,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  25. }
  26. 发送添加地理围栏请求。
  27. public void requestGeoFenceWithNewIntent() {
  28. // 通过传入PendingIntent的方式添加地理围栏,并处理地理围栏添加行为的响应数据
  29. geofenceService.createGeofenceList(getAddGeofenceRequest(), pendingIntent)
  30. .addOnCompleteListener(new OnCompleteListener<Void>() {
  31. @Override
  32. public void onComplete(Task<Void> task) {
  33. if (task.isSuccessful()) {
  34. Log.i(TAG, "add geofence success!");
  35. } else {
  36. 10.                     Log.w(TAG, "add geofence failed : " + task.getException().getMessage());
  37. 11.                 }
  38. 12.             }
  39. 13.         });

14. }

  1. 移除地理围栏。除了通过id移除地理围栏,还可以通过PendingIntent进行移除。
  2. public void removeWithID() {
  3. // 通过id移除地理围栏,并处理地理围栏移除行为的响应数据
  4. geofenceService.deleteGeofenceList(idList)
  5. .addOnCompleteListener(new OnCompleteListener<Void>() {
  6. @Override
  7. public void onComplete(Task<Void> task) {
  8. if (task.isSuccessful()) {
  9. Log.i(TAG, "delete geofence with ID success!");
  10. } else {
  11. 10.                     Log.w(TAG, "delete geofence with ID failed ");
  12. 11.                 }
  13. 12.             }
  14. 13.         });

14. }

  1. 地理围栏触发信息处理。

当检测到用户触发围栏事件时,会通过PendingIntent发送广播通知用户。

  1. // 地理围栏服务广播接收器
  2. public class GeoFenceBroadcastReceiver extends BroadcastReceiver {
  3. public static final String ACTION_PROCESS_LOCATION = "com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION";
  4. @Override
  5. public void onReceive(Context context, Intent intent) {
  6. if (intent != null) {
  7. final String action = intent.getAction();
  8. StringBuilder sb = new StringBuilder();
  9. String next = "\n";
  10. 10.             if (ACTION_PROCESS_LOCATION.equals(action)) {
  11. 11.                 // 从intent中解析出GeofenceData对象
  12. 12.                 GeofenceData geofenceData = GeofenceData.getDataFromIntent(intent);
  13. 13.                 if (geofenceData != null) {
  14. 14.                    // 获取错误码
  15. 15.                    int errorCode = geofenceData.getErrorCode();
  16. 16.                    // 获取地理围栏触发类型
  17. 17.                    int conversion = geofenceData.getConversion();
  18. 18.                    // 获取触发的地理围栏信息
  19. 19.                    List<Geofence> list = geofenceData.getConvertingGeofenceList();
  20. 20.                    // 获取触发时的位置信息
  21. 21.                    Location mLocation = geofenceData.getConvertingLocation();
  22. 22.                    // 是否是正常触发围栏事件,返回false时表示出现错误
  23. 23.                    boolean status = geofenceData.isSuccess();
  24. 24.                    sb.append("errorcode: " + errorCode + next);
  25. 25.                    sb.append("conversion: " + conversion + next);
  26. 26.                    for (int i = 0; i < list.size(); i++){
  27. 27.                        sb.append("geoFence id :" + list.get(i).getUniqueId() + next);
  28. 28.                    }
  29. 29.                    sb.append("location is :" + mLocation.getLongitude() + " " + mLocation.getLatitude() + next);
  30. 30.                    sb.append("is successful :" + status);
  31. 31.                    Log.i(TAG,sb.toString());
  32. 32.                 }
  33. 33.             }
  34. 34.         }
  35. 35.     }

36. }

地理围栏API服务开发的更多相关文章

  1. 活动识别API服务开发

    活动识别API服务开发 要使用华为活动识别服务API,需要确保设备已经下载并安装了HMS Core(APK),并将Location Kit的SDK集成到项目中. 指定应用权限 在Android Q以下 ...

  2. 用HTML5、地理定位API和Web服务来开发移动应用

    HTML 5 是一项让人振奋的技术,这有着充分的理由.这将会是一次技术突破,因为它可以将桌面应用程序功能带入浏览器中.除了传统浏览器外,对于移动浏览器,其潜力甚至更大.不仅如此,最流行的移动浏览器甚至 ...

  3. 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决

    前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...

  4. iOS地理围栏技术的应用

    遇到一个需求,要求监测若干区域,设备进入这些区域则要上传数据,且可以后台监测,甚至app被杀死也要监测.发现oc的地理围栏技术完美匹配这个需求,任务做完了,把遇到的坑记录下来,也许能帮到你呢. 要做这 ...

  5. 在 Android* 商务应用中实施地图和地理围栏特性

    摘要 本案例研究讨论了怎样将地图和地理定位特性构建到 Android* 商务应用中.包含在 Google Maps* 上覆盖商店位置,以及在设备进入商店地理围栏邻近区域时借助地理围栏通知用户. 文件夹 ...

  6. Google Map API V3开发(1)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  7. Google Map API V3开发(4)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  8. 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(2)-查询实现

    在上一篇博客中,我们准备好了数据.现在数据已经以我们需要的格式,存放在Elasticsearch中了. 本文讲述如何在Elasticsearch中进行空间GEO查询和聚合查询,以及如何准备ajax接口 ...

  9. TableStore最佳实践:轻松实现轨迹管理与地理围栏

    摘要: 基于TableStore轻松实现亿量级轨迹管理与地理围栏 一.方案背景 轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹.快递物流流转.车辆定位轨迹等.该场景与地理位置管理类似,核心点与瓶颈 ...

随机推荐

  1. BLDC有感FOC算法理论及其STM32软硬件实现

    位置传感器:旋转编码器          MCU:STM32F405RGT6          功率MOS驱动芯片:DRV8301 全文均假设在无弱磁控制的情况下 FOC算法理论 首先,我们要知道FO ...

  2. POJ2570 二进制,位运算,Floyd

    题意:       给你一个有向图,两点之间有多种连接方式,然后每次询问都问你点A,B之间有哪些方式可以到达,每个小字母是一个方式. 思路:       很巧妙的位运算和Floyd应用,借助Floyd ...

  3. LA3403 天平难题

    题意:      给出房间的宽度r和每个吊坠的重量wi,设计一个尽量宽但宽度不能超过房间宽度的天平,挂着所有挂坠,每个天平的一段要么挂这一个吊坠,要么挂着另一个天平,每个天平的总长度是1,细节我给出题 ...

  4. Python脚本自动化破解大白鲨摄像头(Shodan)

    关于本文的技术知识点,Shodan模块的用法,传送门-->  Python中shadon模块的使用    Shodan的使用 今天我们要利用python进行自动化破解的摄像头叫大白鲨摄像头,他的 ...

  5. IIS7.5配置对PHP的支持

    以下环境是 Windows server2008R2 IIS7.5 一般情况下,windows server系统默认是仅支持IIS+asp 或 IIS+aspx 的 搭配的,但是有时候我们的网站程序是 ...

  6. CVE-2013-0077:Microsoft DirectShow quartz.dll m2p 文件堆溢出漏洞简单分析

    0x01 前言 2012 年 10 月 5 日,exploit-db 漏洞公布站点上发布了 QQplayer.exe 3.7.892 m2p quartz.dll Heap Pointer OverW ...

  7. 多种方法实现实现全排列 + sort调用标准函数库函数的简述

    全排列:所有不同顺序的元素组组成的一个集合.这里使用使用递归实现全排列. 使用递归算算法呢,首先我们先找一下结束的条件:我们要对一组元素(这里使用数字举例)实现全排列,临界条件就是递归到只有一个元素的 ...

  8. OO第三单元总结——JML规格

    一.JML简介 1.JML语言的理论基础 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言 (Behavior In ...

  9. python 键盘中断子线程及graceful exiting方案

    最近需要实现一个服务程序的graceful exiting,保证在退出前关闭所有已创建的子线程 python借助KeyboardInterrupted异常响应键盘中断,因此首先尝试在子线程中try-c ...

  10. C# 搞桌面UI适配国产麒麟Linux+龙芯遇到的一些坑

    由于一些国企有国产化的需求,所以搞了C#适配银河麒麟,适配了X64和龙芯MIPS版本 1. 在银河麒麟的龙芯版本中 pipe2 不能使用,x64版本上却可以用.  pipe2 用来做自定义消息的,搞U ...