有没有更好的方法解决实时显示自己的位置的导航
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:text="Destination:" /> <EditText android:id="@+id/et_destination" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <Button android:id="@+id/btn_navi" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Start navigate"/> <com.baidu.mapapi.MapView android:id="@+id/bmapsView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
1 package com.xmb.navigationdemoactivity; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.baidu.mapapi.BMapManager; 7 import com.baidu.mapapi.GeoPoint; 8 import com.baidu.mapapi.LocationListener; 9 import com.baidu.mapapi.MKAddrInfo; 10 11 import com.baidu.mapapi.ItemizedOverlay; 12 import com.baidu.mapapi.MKDrivingRouteResult; 13 import com.baidu.mapapi.MKEvent; 14 import com.baidu.mapapi.MKGeneralListener; 15 import com.baidu.mapapi.MKPlanNode; 16 import com.baidu.mapapi.MKPoiResult; 17 import com.baidu.mapapi.MKRoute; 18 import com.baidu.mapapi.MKSearch; 19 import com.baidu.mapapi.MKSearchListener; 20 import com.baidu.mapapi.MKStep; 21 import com.baidu.mapapi.OverlayItem; 22 23 import com.baidu.mapapi.MKTransitRouteResult; 24 import com.baidu.mapapi.MKWalkingRouteResult; 25 import com.baidu.mapapi.MapActivity; 26 import com.baidu.mapapi.MapView; 27 import com.baidu.mapapi.MyLocationOverlay; 28 import com.baidu.mapapi.RouteOverlay; 29 30 import android.graphics.drawable.Drawable; 31 import android.location.Location; 32 import android.os.Bundle; 33 import android.annotation.SuppressLint; 34 import android.app.Activity; 35 import android.util.Log; 36 import android.view.Menu; 37 import android.view.MenuItem; 38 import android.view.View; 39 import android.view.View.OnClickListener; 40 import android.view.Window; 41 import android.widget.*; 42 43 @SuppressLint("ParserError") 44 public class NavigationDemoActivity extends MapActivity { 45 private String mMapKey = "C9DF0F24E9FFCCEB4AF1DA296E8A694B311A3073"; 46 private EditText destinationEditText = null; 47 private Button startNaviButton = null; 48 private MapView mapView = null; 49 private BMapManager mMapManager = null; 50 private MyLocationOverlay myLocationOverlay = null; 51 //onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的 52 private LocationListener locationListener; 53 private MKSearch searchModel; 54 GeoPoint pt; 55 56 @Override 57 public void onCreate(Bundle savedInstanceState) { 58 super.onCreate(savedInstanceState); 59 requestWindowFeature(Window.FEATURE_NO_TITLE); 60 setContentView(R.layout.daohang); 61 destinationEditText = (EditText) this.findViewById(R.id.et_destination); 62 startNaviButton = (Button) this.findViewById(R.id.btn_navi); 63 64 mMapManager = new BMapManager(getApplication()); 65 mMapManager.init(mMapKey, new MyGeneralListener()); 66 mMapManager.getLocationManager().setNoitifyInternal(20, 5); 67 super.initMapActivity(mMapManager); 68 69 mapView = (MapView) this.findViewById(R.id.bmapsView); 70 //设置启用内置的缩放控件 71 mapView.setBuiltInZoomControls(true); 72 //设置在缩放动画过程中也显示overlay,默认为不绘制 73 // mapView.setDrawOverlayWhenZooming(true); 74 //获取当前位置层 75 myLocationOverlay = new MyLocationOverlay(this, mapView); 76 //将当前位置的层添加到地图底层中 77 mapView.getOverlays().add(myLocationOverlay); 78 locationListener= new LocationListener(){ 79 @Override 80 public void onLocationChanged(Location location) { 81 // TODO Auto-generated method stub 82 if (location != null){ 83 //生成GEO类型坐标并在地图上定位到该坐标标示的地点 84 85 Log.i("out","onLocationChanged"); 86 pt = new GeoPoint((int)(location.getLatitude()*1e6), 87 (int)(location.getLongitude()*1e6)); 88 Drawable drawable = getResources().getDrawable(R.drawable.car_green); 89 90 mapView.getOverlays().add(new MyOverLayItem(drawable)); 91 // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 92 mapView.getController().animateTo(pt); 93 } 94 } 95 }; 96 97 98 //初始化搜索模块 99 searchModel = new MKSearch(); 100 //设置路线策略为最短距离 101 searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 102 searchModel.init(mMapManager, new MKSearchListener() { 103 //获取驾车路线回调方法 104 @Override 105 public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 106 // 错误号可参考MKEvent中的定义 107 if (error != 0 || res == null) { 108 Toast.makeText(NavigationDemoActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); 109 return; 110 } 111 RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 112 // 此处仅展示一个方案作为示例 113 MKRoute route = res.getPlan(0).getRoute(0); 114 int distanceM = route.getDistance(); 115 String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000); 116 System.out.println("距离:"+distanceKm+"公里---节点数量:"+route.getNumSteps()); 117 for (int i = 0; i < route.getNumSteps(); i++) { 118 MKStep step = route.getStep(i); 119 System.out.println("节点信息:"+step.getContent()); 120 } 121 routeOverlay.setData(route); 122 mapView.getOverlays().clear(); 123 mapView.getOverlays().add(routeOverlay); 124 mapView.invalidate(); 125 mapView.getController().animateTo(res.getStart().pt); 126 } 127 128 //以下两种方式和上面的驾车方案实现方法一样 129 @Override 130 public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 131 //获取步行路线 132 } 133 134 @Override 135 public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 136 //获取公交线路 137 } 138 139 140 @Override 141 public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 142 } 143 144 @Override 145 public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { 146 } 147 }); 148 149 startNaviButton.setOnClickListener(new OnClickListener() { 150 151 @Override 152 public void onClick(View v) { 153 String destination = destinationEditText.getText().toString(); 154 155 //设置起始地(当前位置) 156 MKPlanNode startNode = new MKPlanNode(); 157 startNode.pt = pt; 158 //设置目的地 159 MKPlanNode endNode = new MKPlanNode(); 160 endNode.name = destination; 161 162 //展开搜索的城市 163 String city = getResources().getString(R.string.beijing); 164 // System.out.println("----"+city+"---"+destination+"---"+pt); 165 searchModel.drivingSearch(city, startNode, city, endNode); 166 /* mMapManager.getLocationManager().requestLocationUpdates( 167 // 注册定位事件 168 new LocationListener(){ 169 @Override 170 public void onLocationChanged(Location location) { 171 // TODO Auto-generated method stub 172 if (location != null){ 173 Log.i("out","mMapManager_onLocationChanged"); 174 //生成GEO类型坐标并在地图上定位到该坐标标示的地点 175 pt = new GeoPoint((int)(location.getLatitude()*1e6), 176 (int)(location.getLongitude()*1e6)); 177 Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher); 178 179 mapView.getOverlays().add(new MyOverLayItem(drawable)); 180 // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 181 mapView.getController().animateTo(pt); 182 } 183 } 184 })*/ 185 //步行路线 186 // searchModel.walkingSearch(city, startNode, city, endNode); 187 //公交路线 188 // searchModel.transitSearch(city, startNode, endNode); 189 } 190 }); 191 192 } 193 public class MyOverLayItem extends ItemizedOverlay<OverlayItem> { 194 195 private List<OverlayItem> list = new ArrayList<OverlayItem>(); 196 // 定义一组坐标,都是一个double类型定义 197 198 199 200 // 用于在地图上标识坐标,用一个图片标注 201 public MyOverLayItem(Drawable drawable) { 202 super(drawable); 203 // TODO Auto-generated constructor stub 204 // 第一组数据的在地图上的标注点 205 206 list.add(new OverlayItem(pt, "Point1", "Point1")); 207 208 populate();//刷新地图的功能 209 } 210 211 // 返回指定的list集合中每一个坐标 212 @Override 213 protected OverlayItem createItem(int arg0) { 214 // TODO Auto-generated method stub 215 return list.get(arg0); 216 } 217 218 @Override 219 public int size() { 220 // TODO Auto-generated method stub 221 return list.size(); 222 } 223 224 @Override 225 public boolean onTap(int i) { 226 // TODO Auto-generated method stub 227 Toast.makeText(NavigationDemoActivity.this, list.get(i).getSnippet(), 1).show(); 228 229 return true; 230 } 231 232 } 233 /* 234 class MyLocationListener implements LocationListener { 235 236 @Override 237 public void onLocationChanged(Location location) { 238 // TODO Auto-generated method stub 239 if (location != null){ 240 //生成GEO类型坐标并在地图上定位到该坐标标示的地点 241 pt = new GeoPoint((int)(location.getLatitude()*1e6), 242 (int)(location.getLongitude()*1e6)); 243 // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 244 mapView.getController().animateTo(pt); 245 } 246 } 247 // tv1.setText("经度:" + jindu + ",纬度:" + weidu); 248 //AllMession =new String[4]; 249 // AllMession[0]=jingdu.toString(); 250 // AllMession[1]=weidu.toString(); 251 // Bundle mydata=new Bundle(); 252 // Message msg=new Message(); 253 // mydata.putString("Longltude",String.valueOf(jingdu)); 254 // mydata.putString("Latitude",String.valueOf(weidu)); 255 // mydata.putString("accuracy",Accuray); 256 257 // msg.setData(mydata); 258 // msg.what=1; 259 //Toast.makeText(context, jzdwaddress, Toast.LENGTH_LONG).show(); 260 // handler.sendMessage(msg); 261 262 263 // t1=(TextView)(((Activity)context).findViewById(R.id.label_wz)); 264 // t1.setText("经度:" + jingdu + "\n纬度:" + weidu); 265 // System.out.println("jindu:"+jingdu+" "+"weidu:"+weidu); 266 // MKSearch search = new MKSearch(); 267 // search.init(mapManager, new MyMKSearchListener()); 268 // search.reverseGeocode(new GeoPoint(jingdu, weidu)); 269 // 270 // t2=(TextView)(((Activity)context).findViewById(R.id.label_sj)); 271 // Calendar cal=Calendar.getInstance(); 272 // t2.setText(cal.getTime().toString()); 273 // 274 // t3=(TextView)(((Activity)context).findViewById(R.id.label_jd)); 275 // t3.setText("1118"); 276 } 277 */ 278 @Override 279 protected void onResume() { 280 mMapManager.getLocationManager().requestLocationUpdates(locationListener); 281 myLocationOverlay.enableMyLocation(); 282 myLocationOverlay.enableCompass(); // 打开指南针 283 mMapManager.start(); 284 super.onResume(); 285 } 286 287 @Override 288 protected void onPause() { 289 mMapManager.getLocationManager().removeUpdates(locationListener); 290 myLocationOverlay.disableMyLocation();//显示当前位置 291 myLocationOverlay.disableCompass(); // 关闭指南针 292 mMapManager.stop(); 293 super.onPause(); 294 } 295 296 @Override 297 protected boolean isRouteDisplayed() { 298 // TODO Auto-generated method stub 299 return false; 300 } 301 302 // 常用事件监听,用来处理通常的网络错误,授权验证错误等 303 class MyGeneralListener implements MKGeneralListener { 304 @Override 305 public void onGetNetworkState(int iError) { 306 Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError); 307 Toast.makeText(NavigationDemoActivity.this, "您的网络出错啦!", 308 Toast.LENGTH_LONG).show(); 309 } 310 311 @Override 312 public void onGetPermissionState(int iError) { 313 Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError); 314 if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 315 // 授权Key错误: 316 Toast.makeText(NavigationDemoActivity.this, 317 "请在BMapApiDemoApp.java文件输入正确的授权Key!", 318 Toast.LENGTH_LONG).show(); 319 } 320 } 321 } 322 }