暂时只会这种导航,实时显示自己的位置,,求其他更好的方法,或api
2013-03-12 17:41
417 查看
有没有更好的方法解决实时显示自己的位置的导航
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/02/4c688714477d2daf6bcfe88faa96508f)
<?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>
package com.xmb.navigationdemoactivity; import java.util.ArrayList; import java.util.List; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.LocationListener; import com.baidu.mapapi.MKAddrInfo; import com.baidu.mapapi.ItemizedOverlay; import com.baidu.mapapi.MKDrivingRouteResult; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.MKPlanNode; import com.baidu.mapapi.MKPoiResult; import com.baidu.mapapi.MKRoute; import com.baidu.mapapi.MKSearch; import com.baidu.mapapi.MKSearchListener; import com.baidu.mapapi.MKStep; import com.baidu.mapapi.OverlayItem; import com.baidu.mapapi.MKTransitRouteResult; import com.baidu.mapapi.MKWalkingRouteResult; import com.baidu.mapapi.MapActivity; import com.baidu.mapapi.MapView; import com.baidu.mapapi.MyLocationOverlay; import com.baidu.mapapi.RouteOverlay; import android.graphics.drawable.Drawable; import android.location.Location; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.*; @SuppressLint("ParserError") public class NavigationDemoActivity extends MapActivity { private String mMapKey = "C9DF0F24E9FFCCEB4AF1DA296E8A694B311A3073"; private EditText destinationEditText = null; private Button startNaviButton = null; private MapView mapView = null; private BMapManager mMapManager = null; private MyLocationOverlay myLocationOverlay = null; //onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的 private LocationListener locationListener; private MKSearch searchModel; GeoPoint pt; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.daohang); destinationEditText = (EditText) this.findViewById(R.id.et_destination); startNaviButton = (Button) this.findViewById(R.id.btn_navi); mMapManager = new BMapManager(getApplication()); mMapManager.init(mMapKey, new MyGeneralListener()); mMapManager.getLocationManager().setNoitifyInternal(20, 5); super.initMapActivity(mMapManager); mapView = (MapView) this.findViewById(R.id.bmapsView); //设置启用内置的缩放控件 mapView.setBuiltInZoomControls(true); //设置在缩放动画过程中也显示overlay,默认为不绘制 // mapView.setDrawOverlayWhenZooming(true); //获取当前位置层 myLocationOverlay = new MyLocationOverlay(this, mapView); //将当前位置的层添加到地图底层中 mapView.getOverlays().add(myLocationOverlay); locationListener= new LocationListener(){ @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if (location != null){ //生成GEO类型坐标并在地图上定位到该坐标标示的地点 Log.i("out","onLocationChanged"); pt = new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)); Drawable drawable = getResources().getDrawable(R.drawable.car_green); mapView.getOverlays().add(new MyOverLayItem(drawable)); // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); mapView.getController().animateTo(pt); } } }; //初始化搜索模块 searchModel = new MKSearch(); //设置路线策略为最短距离 searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); searchModel.init(mMapManager, new MKSearchListener() { //获取驾车路线回调方法 @Override public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { // 错误号可参考MKEvent中的定义 if (error != 0 || res == null) { Toast.makeText(NavigationDemoActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); return; } RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); // 此处仅展示一个方案作为示例 MKRoute route = res.getPlan(0).getRoute(0); int distanceM = route.getDistance(); String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000); System.out.println("距离:"+distanceKm+"公里---节点数量:"+route.getNumSteps()); for (int i = 0; i < route.getNumSteps(); i++) { MKStep step = route.getStep(i); System.out.println("节点信息:"+step.getContent()); } routeOverlay.setData(route); mapView.getOverlays().clear(); mapView.getOverlays().add(routeOverlay); mapView.invalidate(); mapView.getController().animateTo(res.getStart().pt); } //以下两种方式和上面的驾车方案实现方法一样 @Override public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { //获取步行路线 } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { //获取公交线路 } @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) { } @Override public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { } }); startNaviButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String destination = destinationEditText.getText().toString(); //设置起始地(当前位置) MKPlanNode startNode = new MKPlanNode(); startNode.pt = pt; //设置目的地 MKPlanNode endNode = new MKPlanNode(); endNode.name = destination; //展开搜索的城市 String city = getResources().getString(R.string.beijing); // System.out.println("----"+city+"---"+destination+"---"+pt); searchModel.drivingSearch(city, startNode, city, endNode); /* mMapManager.getLocationManager().requestLocationUpdates( // 注册定位事件 new LocationListener(){ @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if (location != null){ Log.i("out","mMapManager_onLocationChanged"); //生成GEO类型坐标并在地图上定位到该坐标标示的地点 pt = new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)); Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher); mapView.getOverlays().add(new MyOverLayItem(drawable)); // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); mapView.getController().animateTo(pt); } } })*/ //步行路线 // searchModel.walkingSearch(city, startNode, city, endNode); //公交路线 // searchModel.transitSearch(city, startNode, endNode); } }); } public class MyOverLayItem extends ItemizedOverlay<OverlayItem> { private List<OverlayItem> list = new ArrayList<OverlayItem>(); // 定义一组坐标,都是一个double类型定义 // 用于在地图上标识坐标,用一个图片标注 public MyOverLayItem(Drawable drawable) { super(drawable); // TODO Auto-generated constructor stub // 第一组数据的在地图上的标注点 list.add(new OverlayItem(pt, "Point1", "Point1")); populate();//刷新地图的功能 } // 返回指定的list集合中每一个坐标 @Override protected OverlayItem createItem(int arg0) { // TODO Auto-generated method stub return list.get(arg0); } @Override public int size() { // TODO Auto-generated method stub return list.size(); } @Override public boolean onTap(int i) { // TODO Auto-generated method stub Toast.makeText(NavigationDemoActivity.this, list.get(i).getSnippet(), 1).show(); return true; } } /* class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub if (location != null){ //生成GEO类型坐标并在地图上定位到该坐标标示的地点 pt = new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)); // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); mapView.getController().animateTo(pt); } } // tv1.setText("经度:" + jindu + ",纬度:" + weidu); //AllMession =new String[4]; // AllMession[0]=jingdu.toString(); // AllMession[1]=weidu.toString(); // Bundle mydata=new Bundle(); // Message msg=new Message(); // mydata.putString("Longltude",String.valueOf(jingdu)); // mydata.putString("Latitude",String.valueOf(weidu)); // mydata.putString("accuracy",Accuray); // msg.setData(mydata); // msg.what=1; //Toast.makeText(context, jzdwaddress, Toast.LENGTH_LONG).show(); // handler.sendMessage(msg); // t1=(TextView)(((Activity)context).findViewById(R.id.label_wz)); // t1.setText("经度:" + jingdu + "\n纬度:" + weidu); // System.out.println("jindu:"+jingdu+" "+"weidu:"+weidu); // MKSearch search = new MKSearch(); // search.init(mapManager, new MyMKSearchListener()); // search.reverseGeocode(new GeoPoint(jingdu, weidu)); // // t2=(TextView)(((Activity)context).findViewById(R.id.label_sj)); // Calendar cal=Calendar.getInstance(); // t2.setText(cal.getTime().toString()); // // t3=(TextView)(((Activity)context).findViewById(R.id.label_jd)); // t3.setText("1118"); } */ @Override protected void onResume() { mMapManager.getLocationManager().requestLocationUpdates(locationListener); myLocationOverlay.enableMyLocation(); myLocationOverlay.enableCompass(); // 打开指南针 mMapManager.start(); super.onResume(); } @Override protected void onPause() { mMapManager.getLocationManager().removeUpdates(locationListener); myLocationOverlay.disableMyLocation();//显示当前位置 myLocationOverlay.disableCompass(); // 关闭指南针 mMapManager.stop(); super.onPause(); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } // 常用事件监听,用来处理通常的网络错误,授权验证错误等 class MyGeneralListener implements MKGeneralListener { @Override public void onGetNetworkState(int iError) { Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError); Toast.makeText(NavigationDemoActivity.this, "您的网络出错啦!", Toast.LENGTH_LONG).show(); } @Override public void onGetPermissionState(int iError) { Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError); if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // 授权Key错误: Toast.makeText(NavigationDemoActivity.this, "请在BMapApiDemoApp.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show(); } } } }
相关文章推荐
- 用BCB做一个自己的Color Dector --- 实时显示鼠标所在位置的像素值
- android--自己定义ProgressDialog显示位置(其他Dialog子类都能够设置)
- 调用其他服务器的api时,暂时处理跨域问题的方法——No 'Access-Control-Allow-Origin' header is present on the requested resour
- 在微信上面如何显示自己公司所有产品,连锁店的地理位置,如何调用高德云图API
- 获得 Win32 窗口句柄的更好的方法 ----动态生成并显示 HTML 文档 ----再谈禁用HTML的上下文菜单...
- HTML 获取当前标签在页面的位置,并且把其他的浮动窗口显示过来
- 使用HTML5 Canvas API控制字体的显示与渲染的方法
- MFC视图实时显示鼠标位置实现
- Android 自定义对话框,可设置大小和显示位置,并设置点击其他位置不消失
- javascript实时显示当天日期的方法
- javascript实时显示北京时间的方法
- javascript实时显示当天日期的方法
- thinkphp(tp)框架封装一个自己写的方法到类里面.可以在其他控制器里面调用
- iOS开发之在google地图上显示自己的位置
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- jQuery实时显示鼠标指针位置和键盘ASCII码
- Extjs4 actioncolumn只能显示图标,不能显示文字的暂时解决方法
- 这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程
- RichTextBox选中文本时往自己的其他的位置实现拖拽
- jQuery库-数组操作的工具方法-jQuery自己的方法-DOM导航-链接(撤回)