• 暂时只会这种导航,实时显示自己的位置,,求其他更好的方法,或api


    有没有更好的方法解决实时显示自己的位置的导航

    <?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 }
  • 相关阅读:
    BIEE变量总结
    微信支付回调问题
    内网搭建WEB服务器教程(转载)
    c#简体繁体转换
    js页面之间函数调用
    数据库性能优化一:SQL索引一步到位
    EasyUI兼容IE问题
    SQL函数说明大全
    经典SQL语句大全(绝对的经典)
    Sql Server 常用系统存储过程大全
  • 原文地址:https://www.cnblogs.com/xmb7/p/2956153.html
Copyright © 2020-2023  润新知