老版本! 超级的老版本!!!
前言
唉,项目比较老,目前遇到一个百度地图的定位问题。
描述
每次发起定位的时候,通过授权后可成功定位到位置。
但是再次定位的时候,就无法定位了。
排除:授权,排除各种校验。
代码如下:
private LocationClient mLocationClient;
//获取地理位置
public static void initLocation(final Context context, final OnLocationListener listener) {
if (mLocationClient == null) {
mLocationClient = new LocationClient(context);
}
mLocationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
//Receive Location
/** 这里省略很多业务逻辑 **/
mLocationClient.unRegisterLocationListener(this);
mLocationClient.stop();
}
});
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setOpenGps(true);
option.setIsNeedAddress(true);
option.setTimeOut(12000);//设置超时时间
option.setCoorType("bd09ll");
// option.setIsNeedLocationPoiList(true);
// option.setEnableSimulateGps(true);
// option.setScanSpan(3000);
mLocationClient.setLocOption(option);
mLocationClient.start();
}
解决方式
对比官网的demo后,发现一个地方不同。
官网使用的是 applicationContext
而这里我查代码发现,项目传过来的是个 Activity
.
换成下面的代码,就成了。
为啥? 我也不知道。慢慢看吧。
if (mLocationClient == null) {
mLocationClient = new LocationClient(context.getApplicationContext());
}
问题排查
先问了度娘,反正一顿操作,全没用。
另外需求确实只要求定位一次。所以拿到定位后 stop
也没啥问题。
没办法,再去看看官方文档吧。
然后发现两端有意思的描述。
option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效
添加个3000的配置,发现能间断定位。所以排除各种校验问题。
继续对比,才发现初始化所用的Context不同。
修改后好了。但是为什么呢?
因为是老版本,只能看混淆的代码。一点点尝试排查。