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来实现围栏功能
5 总结
以上就为GPS_Geofencing的总结,如有开发需求,参考如上流程开发。