开发环境准备 1. ADT 2. Node.js 3. PhoneGap 3.0 4. Git 注册百度地图开发者服务并申请密钥 http://lbsyun.baidu.com/apiconsole/key?application=key 注意 因为有很多中文注释,请将Eclipse中的缺省字符代码设置为UTF-8,Windows -> Preferences -> General -> Workspace -> Text File Encoding 选择 Other: UTF-8 1. 首先创建一个PhoneGap应用项目 phonegap create -n MyMapApp -i com.example.mymapapp MyMapApp cd MyMapApp phonegap run android 系统会提示如下信息,并执行应用 [phonegap] detecting Android SDK environment... 注意 如果无法启动应用请检查ADT SDK设置,并且系统环境变量中应包含ADT sdk\tools 和 sdk\platform-tools 的目录 2. 然后将创建的项目导入ADT中 选择File -> Import ... -> Android -> Existing Android Code Into Workspace 3. 将百度地图加入应用 3.1 修改 index.html <! DOCTYPE html> < html> <head > < meta charset= "utf-8" /> < meta name= "format-detection" content = "telephone=no" /> < meta name= "viewport" content = "initial-scale=1.0, user-scalable=no" /> < style type= "text/css" > body,html, #l-map { width: 100% ; height: 100% ; overflow: hidden ; hidden ; margin: 5; } </ style> < title> My Map Application </title > </head > <body > < div id= "l-map" ></div > < script type= "text/javascript" src = "phonegap.js"></ script > < script type= "text/javascript" src = "location.js"></ script > < script type= "text/javascript" src ="http://api.map.baidu.com/api?type=quick&ak=XXXXXXXXXXXXXXXXXXXXXXXX&v=1.0" ></ script> < script type= "text/javascript" src = "js/index.js"></ script > < script type= "text/javascript" > app.initialize(); </ script> </body > </ html> 3.2 将 index.html中加载百度地图URL中ak=XXXXXXXXXXXXXXXXXXXXXXXX值替换为申请的应用密钥(移动端) 3.3 修改 index.js 支持地图定位 function onLocatingSuccess(position) { var point = new BMap.Point(position.coords.longitude, position.coords.latitude) app.addMarker(point) } function onLocatingError(error) { alert( 'code: ' + error.code + '\n' + 'message: ' + error.message + '\n' ); } var app = { // Application Constructor initialize: function() { this .bindEvents(); //创建地图对象 this .createMap(); }, // Bind Event Listeners // // Bind any events that are required on startup. Common events are: // 'load', 'deviceready', ' offline', and 'online'. bindEvents: function() { document.addEventListener( 'deviceready' , this .onDeviceReady, false); }, // deviceready Event Handler // // The scope of 'this' is the event. In order to call the 'receivedEvent' // function, we must explicity call 'app.receivedEvent(...);' onDeviceReady: function() { app.receivedEvent( 'deviceready' ); }, // Locate on a Received Event receivedEvent: function(id) { console.log( 'Received Event: ' + id); navigator.geolocation.getCurrentPosition(onLocatingSuccess, onLocatingError); },
createMap: function(){ // 创建地图对象 var map = new BMap.Map("l-map" ); map.centerAndZoom( new BMap.Point(116.404, 39.915), 14); var zoomControl= new BMap.ZoomControl(); map.addControl(zoomControl); var scaleControl= new BMap.ScaleControl(); map.addControl(scaleControl); this .map = map; },
addMarker: function(point){ this.map.centerAndZoom(point, 16); // 创建图标对象 var myIcon = new BMap.Icon("http://api.map.baidu.com/mapCard/img/location.gif" , new BMap.Size(14, 23), { // 指定定位位置。 anchor: new BMap.Size(7, 25), }); // 创建标注对象并添加到地图 var marker = new BMap.Marker(point, {icon: myIcon}); this .map.addOverlay(marker); } }; 3.4 修改/MyMapApp/AndroidManifest.xml 加入如下权限设置 <uses-permission android:name ="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name= "android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name= "android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name= "android.permission.READ_PHONE_STATE" /> <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name= "android.permission.INTERNET" /> <uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name= "android.permission.READ_LOGS" /> 运行后,就可以看见百度地图出现在应用中,并根据手机获取的定位信息定位到你所在位置 :-) 不过由于天朝要求对经纬度进行加密,即使用手持设备或者导航设备获取到的经纬度,也无法准确在地图上定位而存在很大的偏移。下面我们将利用PhoneGap将百度的定位服务包装成一个插件来解决精确定位的问题。网上很多文章只提供了PhoneGap 2.x的做法而PhoneGap 3.x对插件结构作了很大调整,都不太适用。 4. 配置Android版百度定位SDK 请从下面网址下载百度定位SDK http://developer.baidu.com/map/geosdk-android-download.htm 并按照如下文章配置项目 http://developer.baidu.com/map/geosdk-android-developv4.0.htm 4.1 在 /MyMapApp/AndroidManifest.xml 中applicaion部分加入 < service android:enabled ="true" android:name= "com.baidu.location.f" android:process =":remote" ></ service> 4.2. 将locSDK_4.0.jar复制到libs目录,并将liblocSDK4.so复制到libs/armeabi目录 这时目录结构应该是这个样子 5. 为应用添加PhoneGap插件利用百度定位实现精确定位 可以从Github获取我的百度定位插件的代码 https://github.com/denverdino/BaiduLocationPlugin 将插件安装到当前工程 phonegap local plugin add https://github.com/denverdino/BaiduLocationPlugin 修改 /MyMapApp/src/com/yili/phonegap/plugins/BaiduLocationPlugin.java,添加应用密钥(移动端) locationClient.setAK( "XXXXXXXXXXXXXXXXXXXXXXXX" ); 修改 index.js,将原有的定位方法注释,并调用locationService来进行定位 //navigator.geolocation.getCurrentPosition(onLocatingSuccess, onLocatingError); locationService.getCurrentPosition(onLocatingSuccess, onLocatingError) 执行 phonegap local run android 这样定位就可以实现准确的定位了! 总结: 本文利用PhoneGap实现了一个简单的地图应用,并且利用PhoneGap提供了基于百度定位SDK的定位服务插件,实现了精确定位。如果想深入了解PhoneGap 3.0 插件开发,请参考文档 http:///2013/09/17/how-to-write-a-phonegap-3-0-plugin-for-android/ http://docs./en/3.0.0/guide_hybrid_plugins_index.md.html#Plugin%20Development%20Guide 关于定位服务插件的设计参考了下面的代码,并作了些修改 http://www.oschina.net/question/236257_128561 |
|
来自: liuguichuan > 《Android》