基于Android P的Gps_Geofencing流程分析

1. 概述

GPS_Geofencing即地理围栏定位,其作用就是通过添加一个区域,如果位置不在此区域则上报通知信息。本文档重点是讲接口的调用流程,并不涉及到地理围栏的相关算法。

以下是基于android P分析的流程。

2. 框架分析

2.1功能入口

围栏定位的构造在LMS的函数loadProvidersLocked里面加载完成,如下图

config_enableGeofenceOverlay:如为false,则使用第三方网络定位

config_geofenceProviderPackageName:第三方网络定位包名

config_locationProviderPackageNames:默认的网络定位包名,如果config_enableNetworkLocationOverlay为true,则使用这个包名。

2.2框架流程

围栏定位可由第三方应用实现,Android默认系统不会提供此功能,框架见如下图。

 Google已帮实现接口层,见深蓝色部分,如要开发围栏功能,我们只需要实现IGeofenceProvider接口即可。

2.2类图

 GeofenceProxy类:从命名来看,是个代理,用来完成part2 part3 part4的功能。

Part1:实现JNI层的交互,并传递IGnssGeofenceProvider对象给part3

Part2:实现拉起第三方应用,开始围栏功能

Part3:封装IGnssGeofenceProvider接口,给part4提供IGeofenceHardware接口

Part4:第三方应用实现的围栏功能

2.3 ServiceWatcher代码分析

GeofenceProxy其实不直接跟IGeofenceProvider交互,而是通过代理ServiceWatcher跟它通信。

GeofenceProxy的createAndBind中有两个关键函数,分别是GeofenceProxy的构造函数以及bind。代码如下所示。

 proxy.bindGeofenceProvider()会调用ServiceWatcher的start,我们直接来看它。

 bindBestPackageLocked的工作包括如下。

·检查目标应用程序的签名。

·根据createAndBind第三个参数查找该目标应用程序实现的Service(Android四大组件之

一),即目标应用程序必须提供一个名为"com.android.location.service.GeofenceProvider"的服务。

·然后绑定到该服务上,并获取一个类型为IGeofenceProvider接口的实例。通过该实

例,GeofenceProxy可与位于应用程序交互。

bindBestPackageLocked中最重要的函数是bindToPackageLocked,其代码如下所示。

 绑定成功后,ServiceWathcer的onServiceConnected函数将被调用。

 mNewServiceWork是一个Runnable对象,它由GeofenceProxy提供,其代码如下所示。

 3. 接口说明

GPS_Geofencing的相关接口见如下图。

3.1 init函数指针

1)函数说明

描述

用于初始化回调函数,当底层有信息上报时,gps库会调用此回调函数的上报给上层

函数原型

void  (*init)( GpsGeofenceCallbacks* callbacks )

参数说明

callbacks

geofence_transition_callback

上报围栏状态,如在里面还是外面

geofence_status_callback

GPS围栏是否可用状态

geofence_add_callback

围栏添加状态回调

geofence_remove_callback

围栏删除状态回调

geofence_pause_callback

围栏暂停状态回调

geofence_resume_callback

围栏恢复状态回调

返回值

void

说明

2)GpsGeofenceCallbacks结构体

3)调用逻辑

3.1.1 geofence_transition_callback回调函数

1)函数说明

描述

GPS围栏可用状态

函数原型

void (*gps_geofence_status_callback) (int32_t status, GpsLocation* last_location)

参数说明

status

围栏状态,取值GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABL

location

GPS定位信息

返回值

void

说明

2)调用逻辑

3.1.2geofence_status_callback回调函数

1)函数说明

描述

上报围栏状态

函数原型

void (*gps_geofence_transition_callback) (int32_t geofence_id,  GpsLocation* location, int32_t transition, GpsUtcTime timestamp)

参数说明

geofence_id

围栏id,由应用层提供

location

GPS定位信息

transition

当前处于围栏的位置,取值:GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED,GPS_GEOFENCE_UNCERTAIN

timestamp

时间

返回值

void

说明

2)调用逻辑

3.1.3 geofence_add_callback回调函数

1)函数说明

描述

围栏添加状态回调

函数原型

void (*gps_geofence_add_callback) (int32_t geofence_id, int32_t status)

参数说明

geofence_id

围栏id,由应用层提供

status

GPS_GEOFENCE_OPERATION_SUCCESS

GPS_GEOFENCE_ERROR_ID_UNKNOWN

GPS_GEOFENCE_ERROR_GENERIC

返回值

void

说明

2)调用逻辑

见3.2章节

3.1.4 geofence_remove_callback回调函数

1)函数说明

描述

围栏删除状态回调

函数原型

void (*gps_geofence_remove_callback) (int32_t geofence_id, int32_t status)

参数说明

geofence_id

围栏id,由应用层提供

status

GPS_GEOFENCE_OPERATION_SUCCESS

GPS_GEOFENCE_ERROR_ID_UNKNOWN

GPS_GEOFENCE_ERROR_GENERIC

返回值

void

说明

2)调用逻辑

见3.5章节

3.1.5 geofence_pause_callback回调函数

1)函数说明

描述

围栏删除状态回调

函数原型

void (*gps_geofence_pause_callback) (int32_t geofence_id, int32_t status)

参数说明

geofence_id

围栏id,由应用层提供

status

GPS_GEOFENCE_OPERATION_SUCCESS

GPS_GEOFENCE_ERROR_ID_UNKNOWN

GPS_GEOFENCE_ERROR_GENERIC

返回值

void

说明

2)调用逻辑

见3.3章节

3.1.6 geofence_resume_callback回调函数

1)函数说明

描述

围栏删除状态回调

函数原型

void (*gps_geofence_resume_callback) (int32_t geofence_id, int32_t status)

参数说明

geofence_id

围栏id,由应用层提供

status

GPS_GEOFENCE_OPERATION_SUCCESS

GPS_GEOFENCE_ERROR_ID_UNKNOWN

GPS_GEOFENCE_ERROR_GENERIC

返回值

void

说明

2)调用逻辑

见3.4章节

3.2 add_geofence_area添加围栏

1)函数说明

描述

添加一个围栏

函数原型

void (*add_geofence_area) (int32_t geofence_id, double latitude, double longitude,

       double radius_meters, int last_transition, int monitor_transitions,

       int notification_responsiveness_ms, int unknown_timer_ms)

参数说明

geofence_id

结构体内容见下图

latitude

围栏id,由应用层提供

longitude

纬度

radius_meters

经度

last_transition

半经

monitor_transitions

监视过渡

GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED

GPS_GEOFENCE_UNCERTAIN.

notification_responsiveness_ms

定义关于触发与Geofence关联的转换时应多长时间调用一次回调的尽力而为的描述。 例如,如果使用GPS_GEOFENCE_ENTERED设置为1000毫秒,则在输入地理围栏内应将回调称为1000毫秒。

此参数以毫秒为单位定义。

注意:请勿将其与GPS轮询的速率混淆。 出于节电的原因,可以动态改变GPS采样率; 因此,采样速率可能比此更快或更慢。

unknown_timer_ms

返回值

void

说明

2)调用逻辑

3.3 pause_geofence停止围栏监听

1)函数说明

描述

停止某个围栏监听

函数原型

void (*pause_geofence) (int32_t geofence_id)

geofence_id

围栏id,由应用层提供

返回值

void

说明

2)调用逻辑

3.4 resume_geofence恢复围栏状态

1)函数说明

描述

恢复指定的一个围栏状态

函数原型

void (*resume_geofence) (int32_t geofence_id, int monitor_transitions)

geofence_id

围栏id,由应用层提供

monitor_transitions

监视过渡

返回值

void

说明

2)调用逻辑

3.5 remove_geofence_area删除围栏

1)函数说明

描述

删除指定一个围栏

函数原型

void (*remove_geofence_area) (int32_t geofence_id)

geofence_id

围栏id,由应用层提供

返回值

void

说明

2)调用逻辑

4 GPS库如何开发此功能

  因没有实质的应用场景,而且功能开发也需要模块支持,目前还未有实质代码,但可通过文字总结整理,为后续开发提供参考。具体可分为四步走。

  步骤一:实现gps.h的init函数的功能

  步骤二:实现GpsGeofencingInterface的相关函数指定内容

  步骤三:把实现好GpsGeofencingInterface接口添加到gps_get_extension里面。

  步骤四:开发APK来实现围栏功能

总结

以上就为GPS_Geofencing的总结,如有开发需求,参考如上流程开发。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值