以百度地图为例,对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跑步数据问题答疑》。
相关文章推荐
- Android开发之--android调用手机存在的地图进行定位
- C#开发Android百度地图手机应用程序(多地图展示)
- 在Linux下安装android开发环境并以USB调试方式链接手机进行开发
- android手机地图开发流程基础
- Android百度地图开发(二)地图覆盖物
- Android开发百度地图(一)--显示基本地图
- android中的sqlit3数据库进行手机应用软件开发(自写的一个财务管理软件,这里主要讲收入录入模块)
- Android 百度地图开发-setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
- [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
- Android 百度地图开发问题----解决地图有时候加载不出来问题
- 如何在Android手机上进行Google Map的开发。
- Android百度地图开发之开发第一个小应用,显示基础的地图页面
- 在Linux下安装android开发环境并以USB调试方式链接手机进行开发
- Android地图开发(调用谷歌和百度地图)
- Android开发:通过AdbWireless,不用数据线连接到安卓手机进行调试
- Android 手机地图开发-高德地图问题
- Linux下Android开发连接Android手机进行调试
- Android 百度地图开发教程(一) 地图使用入门及地图表面覆盖物使用
- Android 百度地图开发之地图不刷新问题解决
- Android手机百度地图开发步骤