全部服务产品
开发者频道
定价
登录
防定位作弊
下载开发文档
简介

挖掘各类模拟定位方式对百度定位SDK内部信息的影响特征,综合多源数据信息,有效识别模拟卫星定位结果,为签到、运动、出行、游戏等场景的位置真实性提供有力保障。
在签到类场景中,如果设置了单次定位setOnceLocation(true),则不会返回卫星定位结果,不需进行防定位作弊配置。

防定位作弊配置具体步骤如下:

1. 第一步,准备工作

在使用定位SDK进行具体开发工作之前,需获取密钥(AK), 并对开发工程进行环境配置工作。详细介绍请参考项目创建部分的说明。 此外, Google在Android 6.0中引入了动态权限获取机制,开发者在使用定位SDK之前, 请详细了解关于Android 6.0系统开发须知。

2. 第二步,初始化LocationClient类

请在主线程中声明LocationClient类对象,该对象初始化需传入Context类型参数。 推荐使用getApplicationConext()方法获取全进程有效的Context。
核心代码段如下:

public LocationClient mLocationClient = null;
private MyLocationListener myListener = new MyLocationListener();
//BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口
//原有BDLocationListener接口暂时同步保留。具体介绍请参考后文中的说明
public void onCreate() {
mLocationClient = new LocationClient(getApplicationContext());
//声明LocationClient类
mLocationClient.registerLocationListener(myListener);
//注册监听函数
}
3. 第三步,配置定位SDK参数

要实现定位防作弊功能,需要利用LocationClientOption类配置定位SDK参数。
核心代码及注释说明如下:

LocationClientOption option = new LocationClientOption();
option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
option.setOpenGnss(true);
//可选,设置是否使用卫星定位,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认GCJ02
//GCJ02:国测局坐标;
//BD09ll:百度经纬度坐标;
//BD09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标
option.setEnableSimulateGnss(false);
//可选,设置是否需要过滤卫星定位仿真结果,默认需要,即参数为false
mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
4. 第四步,实现BDAbstractLocationListener接口

Android定位SDK自V7.2版本起,对外提供了Abstract类型的监听接口BDAbstractLocationListener, 用于实现定位监听。原有BDLocationListener暂时保留, 推荐开发者升级到Abstract类型的新监听接口使用, 该接口会异步获取定位结果,核心代码如下:

public class MyLocationListener extends BDAbstractLocationListener{
@Override
public void onReceiveLocation(BDLocation location){
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取位置描述信息相关的结果
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
double latitude = location.getLatitude(); //获取纬度信息
double longitude = location.getLongitude(); //获取经度信息
float radius = location.getRadius(); //获取定位精度,默认值为0.0f
String coorType = location.getCoorType();
//获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
int errorCode = location.getLocType();
// 获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
int strategy = location.getMockGnssStrategy();
// 防作弊策略识别码,用于辅助分析排查问题
int probability = location.getMockGnssProbability();
// 此定位点作弊概率,3代表高概率,2代表中概率,1代表低概率,0代表概率为0
BDLocation realLoc = location.getReallLocation();
if (location.getMockGnssStrategy() > 0 && null != realLoc) {
double dis = location.getDisToRealLocation();
// 虚假位置和真实位置之间的距离
int realLocType = realLoc.getLocType();
// 真实定位结果类型
String realLocTime = realLoc.getTime();
// 真实位置定位时间
double realLat = realLoc.getLatitude();
// 真实纬度
double realLng = realLoc.getLongitude();
// 真实经度
String realLocCoorType = realLoc.getCoorType();
// 真实位置坐标系
}
}
}
5. 第五步,获取定位经纬度

调用LocationClient的start()方法,发起请求,在BDAbstractLocationListener接口中,便可获得。 详细信息请参考获取经纬度中第五步的介绍。

示例Demo

上一篇

地理围栏

下一篇

场景定位

本篇文章对您是否有帮助?