下面是学习郭霖前辈的第一行代码第二版11.3时使用百度定位遇见的一些问题,下面做一下我个人的总结:
第一个问题定位的时候刷新一次纬度和经线就出问题了,如下:
遇见这个问题起初没觉得什么,以为只是因为在室内。直到我遇见了第二个问题,显示不出地图啦!
可能错误有:
1.你在百度开发页面创建应用中,申请应用AK时填入的包名有可能不对应,应该和你项目的包名一样,如我的是com.example.lbstestdemo,申请的时候要一致,引用百度配置方法的教程一句话:包名需要在文件build.gradle中查询 applicationId,并确保 applicationId 与在 AndroidManifest.xml 中定义的包名一致,然后这就是你要的名字。
2.申请AK时填写的SHA1问题,我按书上操作并没有问题,但是也提一下可以参考http://blog.csdn.net/stevenhu_223/article/details/38333611
密钥库口令好像默认为android
3.讲一讲我自己的问题吧,马虎大意。我申请到AK之后直接一拉ctrl+c ctrl+v,然后多了空格!粗心大意的我完全没有在意android:value=” GhpWtReOZFGbLxN7cFMGnTi68jGPrPvr “,后面把空格一删完全没毛病老铁.
最后成功图片
方便测试刷新在后面加了一个刷新次数,图片为第6次刷新时。
当我设置为只通过传感器定位(option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors))时结果如下
由于获取地址信息一定需要用到网络,即便传感器模式只会使用GPS定位也会开启网络定位功能。我的理解是第一次使用的是网络定位得到信息,然后才一直为GPS定位,然后我在室内搜索不到GPS,即使每5秒刷新,但得不到位置信息,也就一直不会返回定位结果,onReceiveLocation方法得不到执行,界面没有更新,于是刷新次数显示在第一次使用网络时的值为1(但其实还在刷新只是没有在界面显示出来)。同理我打开app之前先把数据关闭,那第一次的网络定位也是无法得到定位结果的,即不产生回调,那界面将空白一片。
最后显示地图的效果,待会去继续学习定位地图位置。
继续学习地图定位到我的位置,下面是遇见的问题:
1,定位无效,显示的还是默认的地图。
运行了N次,结果依旧如上一张图片,我绝望的看着天安门广场。
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);
baiduMap.animateMapStatus(update);//以动画方式更新
地图就是不跳到我的位置,可是又看到地图的确是放大了的,即MapStatusUpdateFactory.zoomTo(16f),也就是说语句都正确执行了。
为什么会这样,现在来小小的改动一下代码
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.setMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);
baiduMap.setMapStatus(update);//不以动画方式更新
问题迎刃而解,成功得到想要的结果。问题就在于baiduMap.animateMapStatus(update)和baiduMap.setMapStatus(update)方法的使用,animateMapStatus的功能是以动画方式改变地图状态,在地图还没显示时,不可能运行动画。
对于我原来的代码一共改变了两次地图状态,放大地图和定位,所以不可能同时演示出动画效果,并且后执行的放大地图的动画覆盖了前面定位的动画,所以我只能看到放大后的北京。你可以尝试将它们俩代码的位置反过来,然后你就只能看到自己的位置但看不到缩放级别为16的地图了。只有在地图显示完才能在地图上显示效果,当然你可以写出下面规范一些的代码
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatus newMapStatus = new MapStatus.Builder().target(ll).zoom(16f).build();
MapStatusUpdate update = MapStatusUpdateFactory.newMapStatus(newMapStatus);
baiduMap.animateMapStatus(update);
使用Builder将我要改变的东西放到一块,我只改变一次地图状态,哈哈,现在就可以在已经有的北京上面以动画方式改变地图状态啦。
2.有的人可能遇到的问题一样,可是运行的结果却不同了,但是应该都只是baiduMap.animateMapStatus(update)的问题,你可以尝试着:
1)多更新几次地图,在书上设置了isFirstLocate来限制整个过程更新一次地图,你可以把它isFirstLocate = false注释掉观察。
2)直接使用baiduMap.setMapStatus(update)方法,那应该没有任何其他问题了
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatus newMapStatus = new MapStatus.Builder().target(ll).zoom(16f).build();
MapStatusUpdate update = MapStatusUpdateFactory.newMapStatus(newMapStatus);
baiduMap.setMapStatus(update);
我遇到的问题归根结底就是以动画方式更新地图导致的问题,只要注意好这样更新可能遇见的问题就好了,就像郭霖大神说的,百度LBS SDK未来随时都可能更新,或许更新后这个例子就无法正常运行了,所以自己查阅官方文档或者搜索资料是非常重要的。
有些问题自己再思考思考或许就出来结果啦
本博客可能有一些个人推断在里面,如有问题请留言,相互学习。当然没人看到就算了,haha。
完整项目需要的话请前往我的Github地址(写个博客也挺花时间的,所以请求给我Github上的这个项目一个star,蟹蟹蟹蟹啦)https://github.com/jianhaojiang/LBSTestDemo.git
参考的一些链接:
http://blog.csdn.net/crazy1235/article/details/43898451
http://blog.csdn.net/qiuyejingmei20/article/details/39935013
http://blog.csdn.net/csu54zzg/article/details/40305029