前几天百度举办了百度世界大会,可惜没去参加,之前参加了百度的开发者大会,在会上也了解了百度的产品,百度现在朝着平台化的方向在发展,感觉很不错,也试用了百度的产品,现在就用着百度的网盘,今天看了下百度地图的开放API,然后做了个Demo,这里分享出来。如果应用主要针对国内市场的话,用百度地图还是一个比较不错的选择。另外,百度还有一个PCS(Personal cloud storage)个人云存储,我比较感兴趣,之后也会继续研究,然后做个Demo分享给大家。今天就先看看这个利用百度地图定位并实现目的地导航的Demo。首先看实现效果:

                                              

进入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路、步行线路,在代码中都有详细注释。另外,在控制台还输出了线路上每一个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息。如下图:

                      


接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料百度地图API,然后就是为需要加入地图的应用注册APP KEY,注册完后,下载百度地图jar文件,新建工程,并导入即可,下面看实现具体代码,在代码中有详细注释:

  1. public class NavigationDemoActivity extends MapActivity {  
  2.     private String mMapKey = "注册自己的key";  
  3.     private EditText destinationEditText = null;  
  4.     private Button startNaviButton = null;  
  5.     private MapView mapView = null;  
  6.     private BMapManager mMapManager = null;  
  7.     private MyLocationOverlay myLocationOverlay = null;  
  8.     //onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的  
  9.     private LocationListener locationListener;  
  10.     private MKSearch searchModel;  
  11.     GeoPoint pt;  
  12.       
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  17.         setContentView(R.layout.main);  
  18.         destinationEditText = (EditText) this.findViewById(R.id.et_destination);  
  19.         startNaviButton = (Button) this.findViewById(R.id.btn_navi);  
  20.           
  21.         mMapManager = new BMapManager(getApplication());  
  22.         mMapManager.init(mMapKey, new MyGeneralListener());  
  23.         super.initMapActivity(mMapManager);  
  24.           
  25.         mapView = (MapView) this.findViewById(R.id.bmapsView);  
  26.         //设置启用内置的缩放控件  
  27.         mapView.setBuiltInZoomControls(true);    
  28.         //设置在缩放动画过程中也显示overlay,默认为不绘制  
  29. //        mapView.setDrawOverlayWhenZooming(true);  
  30.         //获取当前位置层  
  31.         myLocationOverlay = new MyLocationOverlay(this, mapView);  
  32.         //将当前位置的层添加到地图底层中  
  33.         mapView.getOverlays().add(myLocationOverlay);  
  34.           
  35.         // 注册定位事件  
  36.         locationListener = new LocationListener(){  
  37.   
  38.             @Override  
  39.             public void onLocationChanged(Location location) {  
  40.                 if (location != null){  
  41.                     //生成GEO类型坐标并在地图上定位到该坐标标示的地点  
  42.                      pt = new GeoPoint((int)(location.getLatitude()*1e6),  
  43.                             (int)(location.getLongitude()*1e6));  
  44. //                  System.out.println("---"+location.getLatitude() +":"+location.getLongitude());  
  45.                     mapView.getController().animateTo(pt);  
  46.                 }  
  47.             }  
  48.         };  
  49.           
  50.         //初始化搜索模块  
  51.         searchModel = new MKSearch();  
  52.         //设置路线策略为最短距离  
  53.         searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);  
  54.         searchModel.init(mMapManager, new MKSearchListener() {  
  55.             //获取驾车路线回调方法  
  56.             @Override  
  57.             public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {  
  58.                 // 错误号可参考MKEvent中的定义  
  59.                 if (error != 0 || res == null) {  
  60.                     Toast.makeText(NavigationDemoActivity.this"抱歉,未找到结果", Toast.LENGTH_SHORT).show();  
  61.                     return;  
  62.                 }  
  63.                 RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView);  
  64.                   
  65.                 // 此处仅展示一个方案作为示例  
  66.                 MKRoute route = res.getPlan(0).getRoute(0);  
  67.                 int distanceM = route.getDistance();  
  68.                 String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000);  
  69.                 System.out.println("距离:"+distanceKm+"公里---节点数量:"+route.getNumSteps());  
  70.                 for (int i = 0; i < route.getNumSteps(); i++) {  
  71.                     MKStep step = route.getStep(i);  
  72.                     System.out.println("节点信息:"+step.getContent());  
  73.                 }  
  74.                 routeOverlay.setData(route);  
  75.                 mapView.getOverlays().clear();  
  76.                 mapView.getOverlays().add(routeOverlay);  
  77.                 mapView.invalidate();  
  78.                 mapView.getController().animateTo(res.getStart().pt);  
  79.             }  
  80.               
  81.             //以下两种方式和上面的驾车方案实现方法一样  
  82.             @Override  
  83.             public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) {  
  84.                 //获取步行路线  
  85.             }  
  86.               
  87.             @Override  
  88.             public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {  
  89.                 //获取公交线路  
  90.             }  
  91.               
  92.             @Override  
  93.             public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {  
  94.             }  
  95.             @Override  
  96.             public void onGetAddrResult(MKAddrInfo arg0, int arg1) {  
  97.             }  
  98.             @Override  
  99.             public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {  
  100.             }  
  101.             @Override  
  102.             public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {  
  103.             }  
  104.         });  
  105.           
  106.         startNaviButton.setOnClickListener(new OnClickListener() {  
  107.               
  108.             @Override  
  109.             public void onClick(View v) {  
  110.                 String destination = destinationEditText.getText().toString();  
  111.                   
  112.                 //设置起始地(当前位置)  
  113.                 MKPlanNode startNode = new MKPlanNode();  
  114.                 startNode.pt = pt;  
  115.                 //设置目的地  
  116.                 MKPlanNode endNode = new MKPlanNode();   
  117.                 endNode.name = destination;  
  118.                   
  119.                 //展开搜索的城市  
  120.                 String city = getResources().getString(R.string.beijing);  
  121. //              System.out.println("----"+city+"---"+destination+"---"+pt);  
  122.                 searchModel.drivingSearch(city, startNode, city, endNode);  
  123.                 //步行路线  
  124. //              searchModel.walkingSearch(city, startNode, city, endNode);  
  125.                 //公交路线  
  126. //              searchModel.transitSearch(city, startNode, endNode);  
  127.             }  
  128.         });  
  129.           
  130.     }  
  131.       
  132.     @Override  
  133.     protected void onResume() {  
  134.         mMapManager.getLocationManager().requestLocationUpdates(locationListener);  
  135.         myLocationOverlay.enableMyLocation();  
  136.         myLocationOverlay.enableCompass(); // 打开指南针  
  137.         mMapManager.start();  
  138.         super.onResume();  
  139.     }  
  140.       
  141.     @Override  
  142.     protected void onPause() {  
  143.         mMapManager.getLocationManager().removeUpdates(locationListener);  
  144.         myLocationOverlay.disableMyLocation();//显示当前位置  
  145.         myLocationOverlay.disableCompass(); // 关闭指南针  
  146.         mMapManager.stop();  
  147.         super.onPause();  
  148.     }  
  149.   
  150.     @Override  
  151.     protected boolean isRouteDisplayed() {  
  152.         // TODO Auto-generated method stub  
  153.         return false;  
  154.     }  
  155.       
  156.     // 常用事件监听,用来处理通常的网络错误,授权验证错误等  
  157.     class MyGeneralListener implements MKGeneralListener {  
  158.             @Override  
  159.             public void onGetNetworkState(int iError) {  
  160.                 Log.d("MyGeneralListener""onGetNetworkState error is "+ iError);  
  161.                 Toast.makeText(NavigationDemoActivity.this"您的网络出错啦!",  
  162.                         Toast.LENGTH_LONG).show();  
  163.             }  
  164.   
  165.             @Override  
  166.             public void onGetPermissionState(int iError) {  
  167.                 Log.d("MyGeneralListener""onGetPermissionState error is "+ iError);  
  168.                 if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {  
  169.                     // 授权Key错误:  
  170.                     Toast.makeText(NavigationDemoActivity.this,   
  171.                             "请在BMapApiDemoApp.java文件输入正确的授权Key!",  
  172.                             Toast.LENGTH_LONG).show();  
  173.                 }  
  174.             }  
  175.         }  
  176. }  

然后是布局文件:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:orientation="horizontal" >  
  11.   
  12.         <TextView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:textSize="18sp"  
  16.             android:text="Destination:" />  
  17.   
  18.         <EditText  
  19.             android:id="@+id/et_destination"  
  20.             android:layout_width="fill_parent"  
  21.             android:layout_height="wrap_content" />  
  22.     </LinearLayout>  
  23.       
  24.     <Button   
  25.         android:id="@+id/btn_navi"  
  26.         android:layout_width="fill_parent"  
  27.            android:layout_height="wrap_content"  
  28.            android:text="Start navigate"/>  
  29.   
  30.     <com.baidu.mapapi.MapView  
  31.         android:id="@+id/bmapsView"  
  32.         android:layout_width="fill_parent"  
  33.         android:layout_height="fill_parent"  
  34.         android:clickable="true" />  
  35.   
  36. </LinearLayout>  

AndroidMainifest.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.ericssonlabs"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>  
  10.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>  
  11.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  12.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  
  13.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>    
  14.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>   
  15.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
  16.       
  17.     <supports-screens android:largeScreens="true"  
  18.         android:normalScreens="true" android:smallScreens="true"  
  19.         android:resizeable="true" android:anyDensity="true"/>  
  20.     <uses-sdk android:minSdkVersion="3"></uses-sdk>  
  21.   
  22.     <application  
  23.         android:icon="@drawable/ic_launcher"  
  24.         android:label="@string/app_name" >  
  25.         <activity  
  26.             android:name=".NavigationDemoActivity"  
  27.             android:label="@string/app_name" >  
  28.             <intent-filter>  
  29.                 <action android:name="android.intent.action.MAIN" />  
  30.   
  31.                 <category android:name="android.intent.category.LAUNCHER" />  
  32.             </intent-filter>  
  33.         </activity>  
  34.     </application>  
  35.   
  36. </manifest>  

对Android&IOS感兴趣的朋友可以加入我们的讨论QQ群,在这里,我们只讨论干货:

iOS群:220223507

Android群:282552849


欢迎关注我的新浪微博和我交流:@唐韧_Ryan

原文地址:点击打开链接

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐