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的总结,如有开发需求,参考如上流程开发。
本文详细介绍了Android P系统中GPS地理围栏(Geofencing)的实现机制,从功能入口、框架流程、类图分析到关键服务组件ServiceWatcher的工作原理。文中还阐述了如何通过JNI层交互、启动第三方应用以及实现IGeofenceProvider接口来搭建围栏功能。此外,详细解析了GPS Geofencing的相关接口,包括添加、暂停、恢复和删除围栏的API调用逻辑,为开发者提供了参考流程。
1238

被折叠的 条评论
为什么被折叠?



