地理围栏API服务开发
地理围栏API服务开发
要使用华为地理围栏服务API,需要确保设备已经下载并安装了HMS Core(APK),并将Location Kit的SDK集成到项目中。
指定应用权限
- 如果需要使用地理围栏服务API,需要在“AndroidManifest.xml”文件中申请ACCESS_FINE_LOCATION权限和ACCESS_COARSE_LOCATION权限:
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
- <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文件中注册广播接收器。
- <!--注册地理围栏服务广播接收器-->
- <receiver
- android:name=".geofence.GeoFenceBroadcastReceiver"
- android:exported="true">
- <intent-filter>
- <action android:name="com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION" />
- </intent-filter>
- </receiver>
创建地理围栏服务客户端
在Activity的OnCreate()方法中创建GeofenceService实例,并使用该实例调用与geofence相关的API接口。
- private GeofenceService geofenceService;
- private ArrayList<String> idList;
- private ArrayList<Geofence> geofenceList;
- private String TAG;
- private PendingIntent pendingIntent;
- protected void onCreate(Bundle savedInstanceState) {
- // 创建一个新的GeofenceService实例
- geofenceService = LocationServices.getGeofenceService(this);
- // 获取PendingIntent对象
- 10. pendingIntent = getPendingIntent();
- 11. idList = new ArrayList<String>();
- 12. geofenceList = new ArrayList<Geofence>();
- 13. TAG = "geoFence";
14. }
创建并添加地理围栏
可以先创建地理围栏实例,并构建添加地理围栏的请求。在发送请求之后,会通过Task通知是否添加成功。
- 创建地理围栏实例。
- geofenceList.add(new Geofence.Builder()
- .setUniqueId("mGeofence")
- .setValidContinueTime(10000)
- // 传入经纬度信息,圆形地理围栏半径(单位:米)
- .setRoundArea(latitude, longitude, radius)
- // 进入或退出围栏时触发回调
- .setConversions(Geofence.ENTER_GEOFENCE_CONVERSION | Geofence.EXIT_GEOFENCE_CONVERSION)
- .build());
- idList.add("mGeofence");
- 创建添加地理围栏的请求。
- private GeofenceRequest getAddGeofenceRequest() {
- GeofenceRequest.Builder builder = new GeofenceRequest.Builder();
- // 当用户在围栏中时,添加围栏后立即触发回调
- builder.setInitConversions(GeofenceRequest.ENTER_INIT_CONVERSION);
- builder.createGeofenceList(geofenceList);
- return builder.build();
- }
- 动态注册GeoFenceBroadcastReceiver广播接收器。
- // 通过PendingIntent动态注册GeoFenceBroadcastReceiver广播接收器,当触发围栏的时候,会通过广播通知。
- private PendingIntent getPendingIntent() {
- Intent intent = new Intent(this, GeoFenceBroadcastReceiver.class);
- intent.setAction(GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION);
- return PendingIntent.getBroadcast(this,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- }
- 发送添加地理围栏请求。
- public void requestGeoFenceWithNewIntent() {
- // 通过传入PendingIntent的方式添加地理围栏,并处理地理围栏添加行为的响应数据
- geofenceService.createGeofenceList(getAddGeofenceRequest(), pendingIntent)
- .addOnCompleteListener(new OnCompleteListener<Void>() {
- @Override
- public void onComplete(Task<Void> task) {
- if (task.isSuccessful()) {
- Log.i(TAG, "add geofence success!");
- } else {
- 10. Log.w(TAG, "add geofence failed : " + task.getException().getMessage());
- 11. }
- 12. }
- 13. });
14. }
- 移除地理围栏。除了通过id移除地理围栏,还可以通过PendingIntent进行移除。
- public void removeWithID() {
- // 通过id移除地理围栏,并处理地理围栏移除行为的响应数据
- geofenceService.deleteGeofenceList(idList)
- .addOnCompleteListener(new OnCompleteListener<Void>() {
- @Override
- public void onComplete(Task<Void> task) {
- if (task.isSuccessful()) {
- Log.i(TAG, "delete geofence with ID success!");
- } else {
- 10. Log.w(TAG, "delete geofence with ID failed ");
- 11. }
- 12. }
- 13. });
14. }
- 地理围栏触发信息处理。
当检测到用户触发围栏事件时,会通过PendingIntent发送广播通知用户。
- // 地理围栏服务广播接收器
- public class GeoFenceBroadcastReceiver extends BroadcastReceiver {
- public static final String ACTION_PROCESS_LOCATION = "com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION";
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent != null) {
- final String action = intent.getAction();
- StringBuilder sb = new StringBuilder();
- String next = "\n";
- 10. if (ACTION_PROCESS_LOCATION.equals(action)) {
- 11. // 从intent中解析出GeofenceData对象
- 12. GeofenceData geofenceData = GeofenceData.getDataFromIntent(intent);
- 13. if (geofenceData != null) {
- 14. // 获取错误码
- 15. int errorCode = geofenceData.getErrorCode();
- 16. // 获取地理围栏触发类型
- 17. int conversion = geofenceData.getConversion();
- 18. // 获取触发的地理围栏信息
- 19. List<Geofence> list = geofenceData.getConvertingGeofenceList();
- 20. // 获取触发时的位置信息
- 21. Location mLocation = geofenceData.getConvertingLocation();
- 22. // 是否是正常触发围栏事件,返回false时表示出现错误
- 23. boolean status = geofenceData.isSuccess();
- 24. sb.append("errorcode: " + errorCode + next);
- 25. sb.append("conversion: " + conversion + next);
- 26. for (int i = 0; i < list.size(); i++){
- 27. sb.append("geoFence id :" + list.get(i).getUniqueId() + next);
- 28. }
- 29. sb.append("location is :" + mLocation.getLongitude() + " " + mLocation.getLatitude() + next);
- 30. sb.append("is successful :" + status);
- 31. Log.i(TAG,sb.toString());
- 32. }
- 33. }
- 34. }
- 35. }
36. }
地理围栏API服务开发的更多相关文章
- 活动识别API服务开发
活动识别API服务开发 要使用华为活动识别服务API,需要确保设备已经下载并安装了HMS Core(APK),并将Location Kit的SDK集成到项目中. 指定应用权限 在Android Q以下 ...
- 用HTML5、地理定位API和Web服务来开发移动应用
HTML 5 是一项让人振奋的技术,这有着充分的理由.这将会是一次技术突破,因为它可以将桌面应用程序功能带入浏览器中.除了传统浏览器外,对于移动浏览器,其潜力甚至更大.不仅如此,最流行的移动浏览器甚至 ...
- 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...
- iOS地理围栏技术的应用
遇到一个需求,要求监测若干区域,设备进入这些区域则要上传数据,且可以后台监测,甚至app被杀死也要监测.发现oc的地理围栏技术完美匹配这个需求,任务做完了,把遇到的坑记录下来,也许能帮到你呢. 要做这 ...
- 在 Android* 商务应用中实施地图和地理围栏特性
摘要 本案例研究讨论了怎样将地图和地理定位特性构建到 Android* 商务应用中.包含在 Google Maps* 上覆盖商店位置,以及在设备进入商店地理围栏邻近区域时借助地理围栏通知用户. 文件夹 ...
- 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 ...
- 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 ...
- 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(2)-查询实现
在上一篇博客中,我们准备好了数据.现在数据已经以我们需要的格式,存放在Elasticsearch中了. 本文讲述如何在Elasticsearch中进行空间GEO查询和聚合查询,以及如何准备ajax接口 ...
- TableStore最佳实践:轻松实现轨迹管理与地理围栏
摘要: 基于TableStore轻松实现亿量级轨迹管理与地理围栏 一.方案背景 轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹.快递物流流转.车辆定位轨迹等.该场景与地理位置管理类似,核心点与瓶颈 ...
随机推荐
- CString,string,char数组的转换
来源:http://ticktick.blog.51cto.com/823160/317550 //----------------ANSI字符串转换为UNICODE字符串-------------- ...
- Linux-鸟菜-4-关机的正确姿势
Linux-鸟菜-4-关机的正确姿势 这章里面鸟哥介绍了基本的登录操作以及一些基本命令还有关机的正确姿势,基本的命令我都整理到常用命令3里面了,关机的这个感觉挺重要,单独整理下. 由于Linux本身是 ...
- 发生系统错误 1275.此驱动程序被阻止加载 寒江孤钓<<windows 内核安全编程>> 学习笔记
安装书中第一章成功安装first服务之后,在cmd窗口使用命令行 "net start first" 时, 出现 "发生系统错误 1275.此驱动程序被阻止加载" ...
- PHP 上传文件至阿里云OSS对象存储
简述 1.阿里云开通对象存储服务 OSS 并创建Bucket 2.下载PHP SDK至框架扩展目录,点我下载 3.码上code 阿里云操作 开通对象存储服务 OSS 创建 Bucket 配置Acces ...
- 多种方法实现实现全排列 + sort调用标准函数库函数的简述
全排列:所有不同顺序的元素组组成的一个集合.这里使用使用递归实现全排列. 使用递归算算法呢,首先我们先找一下结束的条件:我们要对一组元素(这里使用数字举例)实现全排列,临界条件就是递归到只有一个元素的 ...
- SQLFlow使用中的注意事项--设置篇
SQLFlow 是用于追溯数据血缘关系的工具,它自诞生以来以帮助成千上万的工程师即用户解决了困扰许久的数据血缘梳理工作. 数据库中视图(View)的数据来自表(Table)或其他视图,视图中字段(Co ...
- mybatis新手快速搭建成功详细操作
1.数据库建表 在数据库中新建一个名为mybatis的数据库,在mybatis数据库中新建一张 t_user 表,表中有3个字段,id,name,password,代码如下: 新建一个mybatis数 ...
- Morgan Stanley Books List:经典金融书籍推荐
一.经济学 1. 中华帝国的专制制度,佛朗索瓦.魁奈 2. 资本论(共3卷),马恩全集 3. 国家竞争优势,麦克尔.波特 4. Essentials of corporate analysis, by ...
- 5分钟让你理解K8S必备架构概念,以及网络模型(上)
写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...
- Mybatis-spring-boot-starter自动配置的原理分析
相信大家在使用SpringBoot的过程中,经常会使用到mybatis,通过使用mybatis-spring-boot-starter依赖进行自动配置,省去了自己依赖配置和Bean配置的很多麻烦. 有 ...