您的位置:首页 > 移动开发

以百度地图为例,对android手机移动端地图开发进行简介

2017-08-24 23:03 495 查看

简介

手机地图是比较常见的功能,很多应用都需要基于位置信息。国内使用的比较多的在线地图厂家主要是高德、百度,国外的是google和微软。高德和百度更新比较快,使用的地图源是免费的。城市里的卫星图还可以,但是到了郊区,就没有16级以上的卫星图(地图的详细程度,数值越大,看的越清楚)。而google地图更新很慢,但是卫星图是完整的。另外还有就是天地图。

安卓平台上的地图软件有OruxMaps和Locus,具体的使用可以参考磨坊论坛的通讯与导航版。国内的工具有个人开发的ios端的乐图、地图加加。其中乐图的开发者还开源了一个离线地图下载器Mobile Atlas Creator。

地图网站接口

本质上这些地图网站都支持TMS接口。TMS是tile map service的缩写,是一种瓦片地图服务,也称之为WMTS(web map tile service)。各大地图网站的访问url格式都是固定的。比如google地图的瓦片地址是http://mt{$serverpart}.google.cn/vt/lyrs=s&hl=zh-CN&gl=cn&x={$x}&y={$y}&z={$z},那么地图每一个小的区域对应的就是 256 × 256 像素的png文件。有兴趣的可以打开浏览器,访问地图网站的卫星图,然后在开发者工具中看到下载的地图图片。

了解这这些,那么可以通过php或者js的接口直接访问地图,在安卓手机上使用webview。也可以通过sdk来访问。最后还有一个方式是通过ArcGIS平台进行开发。

百度地图sdk使用

百度地图安卓sdk的文档很齐全,通过http://lbsyun.baidu.com/都可以方便的下载。对于初学者,我推荐先看文档,再跑一下官方的demo,基本上就能上手。注意在AndroidManifest.xml里面需要配置访问应用(AK),在百度开放平台的网站上免费申请。

简单来说,百度sdk是一个service,通过这个service跟baidu地图的服务器进行通讯。百度地图最新的V4.4版本包括so库和jar包。其中so库分成好几个架构的arm64-v8a、armeabi、armeabi-v7a、x86、x86_64目录,还有一个BaiduLBS_Android.jar。为了减少最后apk的大小,可以删掉x86和x86_64目录,因为这两个架构的手机很少。

百度地图手机定位

手机上的gps或者北斗芯片可以确定所在的经纬度,安卓手机可以使用android的api,也可以使用百度地图的定位sdk来完成。百度地图的定位是LocationClient这个class,配置好监听函数和扫描间隔时间,就可以调用start启动定位。所在的位置信息可以在监听函数onReceiveLocation中获得。

定位可以通过wifi和gps来完成。据观察,先尝试通过wifi定位,然后才是gps定位。当连接上wifi的情况下,第一次回调函数的地址就是正确的。在没有连接wifi的情况下,第一次回调函数可能会报错,location参数的 getLocType()返回TypeNetWorkException,同时logcat里面观察到baidu sdk访问loc.map.baidu.com地址报错。然后才开始启动GPS确定位置,后续请求通过手机GPS来定位。

08-24 10:11:29.280: D/baidu_location_service(3200): baidu location service start1 ...3200
08-24 10:11:29.335: D/baidu_location_service(3200): baidu location service register ...
08-24 10:11:29.336: D/baidu_location_service(3200): start gps...
08-24 10:11:29.420: I/baidu_location_service(3200): LocationAuthManager Authentication Error errorcode = 0 , msg = {"status":0,"message":"","ak":"cZ9tZ3jxyCQovoQa3QduyCuAmKKXwfsr","token":"1d37uO97avvxUqm1QS71iV0n\/cMBkBt9p6S82N5DZBJYUJpCcMC\/LRh7Adi2ALPhpwylHcv1Zq4TRdLUQr7MtjRAQy85TsnsTTkgTtDE2qgzLAd9F2z7Caho52O\/g2J6zEOdRuqn+\/UNOUHihhsa0zU4YOdso8IrJHdJl3k89rJTvNeA6d+helMT\/Ivm\/H+26Cr\/1wU","uid":"282130931","sk":"hA21p8xvALcq8wOLBXovnrG2douE7ZgV"}
08-24 10:11:29.452: D/NetworkSecurityConfig(3200): No Network Security Config specified, using platform default
08-24 10:11:29.459: W/System.err(3200): java.net.UnknownHostException: Unable to resolve host "loc.map.baidu.com": No address associated with hostname
08-24 10:11:29.460: W/System.err(3200): 	at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:125)
08-24 10:11:29.460: W/System.err(3200): 	at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
08-24 10:11:29.460: W/System.err(3200): 	at java.net.InetAddress.getAllByName(InetAddress.java:752)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:346)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:247)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:257)
08-24 10:11:29.460: W/System.err(3200): 	at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
08-24 10:11:29.461: W/System.err(3200): 	at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java)
08-24 10:11:29.461: W/System.err(3200): 	at com.baidu.location.d.h.run(Unknown Source)
08-24 10:11:29.461: W/System.err(3200): Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
08-24 10:11:29.461: W/System.err(3200): 	at libcore.io.Posix.android_getaddrinfo(Native Method)
08-24 10:11:29.461: W/System.err(3200): 	at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
08-24 10:11:29.461: W/System.err(3200): 	at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:106)
08-24 10:11:29.461: W/System.err(3200): 	... 15 more
08-24 10:11:29.461: I/baidu_location_service(3200): https NetworkCommunicationException!

如何在安卓后台长期监听GPS位置

有一些应用需要持续的收集GPS位置。需要将监听代码写到service中,service在后台长时间运行。注意为了省电,并不需要每隔10秒钟就回调一次。可以参考的做法是先打开GRS监听,在回调函数中收到一个正确的GPS位置,然后关闭GPS监听,并在alarmmanager中设置某个时间间隔后,重启GRS监听。这个过程一直循环下去。这样保证service可以长期运行,并且不占用太多资源。

注意有一些手机会及时清理后台service,需要配置对我们的服务不进行清理。可以参考悦跑圈对某个手机的问题分析《MIUI7跑步数据问题答疑》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: