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的总结,如有开发需求,参考如上流程开发。