English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Beispielcode zur Implementierung der Navigation zur Position und zum Ziel in Android

Heute habe ich zufällig gesehen, dass ein Techniker-Guru die Baidu-Map zur Positionsbestimmung und zur Navigation verwendet hat. Ich fand es sehr gut und habe es hier geteilt, um gemeinsam zu teilen. Im Folgenden sehen wir das Implementierungsergebnis:

       

Nach dem Eintreten erhalten wir zunächst den aktuellen Standort, der auf der Karte angezeigt wird. Nachdem Sie das Ziel in das Eingabefeld eingeben, erscheint die beste Route auf der Karte. Hier habe ich die Route mit dem kürzesten Fahrweg eingestellt, aber es gibt auch Buslinien und Fußgängerrouten, die im Code detailliert beschrieben sind. Außerdem werden im Konsolenausgabe die Informationen jeder Station der Route sowie die Entfernung zwischen dem Start- und Zielort angezeigt, die Informationen werden auf der aktuellen Knoten-Navigation angezeigt. Wie im folgenden Bild gezeigt:

 

Hier sehen wir, wie die Implementierung erfolgt, zunächst müssen wir einen Baidu-Entwickleraccount registrieren und die zugehörigen Informationen zur Baidu-Map-API einsehen. Anschließend müssen wir einen APP KEY für die Anwendung registrieren, die die Karte verwenden soll. Nach der Registrierung können wir die Baidu-Map-JAR-Datei herunterladen, ein neues Projekt erstellen und die Datei importieren. Im Folgenden sehen wir das spezifische Implementierungscode, der detaillierte Kommentare enthält:

public class NavigationDemoActivity extends MapActivity { 
  private String mMapKey = "注册自己的key"; 
  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.main); 
    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()); 
    super.initMapActivity(mMapManager); 
    mapView = (MapView) this.findViewById(R.id.bmapsView); 
    //设置启用内置的缩放控件 
    mapView.setBuiltInZoomControls(true);  
    //设置在缩放动画过程中也显示overlay,默认为不绘制 
//    mapView.setDrawOverlayWhenZooming(true); 
    //Positionsebene der aktuellen Position abrufen 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //Fügen Sie die Ebene der aktuellen Position in den unteren Teil der Karte hinzu 
    mapView.getOverlays().add(myLocationOverlay); 
    // Ortungsevente registrieren 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location location) { 
        if (location != null){ 
          //Erstellen Sie GEO-Typ-Koordinaten und positionieren Sie das entsprechende Symbol auf der Karte 
           pt = new GeoPoint((int)(location.getLatitude()*1e6), 
              (int)(location.getLongitude()*1e6)); 
//         System.out.println("---"+location.getLatitude() +:+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }; 
    //Modul zur Suche initialisieren 
    searchModel = new MKSearch(); 
    //Route-Strategie auf kürzeste Distanz einstellen 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      //Rückruffunktion zum Abrufen der Fahrtrouten 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // Fehlercode kann in der Definition von MKEvent referenziert werden 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "Entschuldigung, kein Ergebnis gefunden", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // In diesem Beispiel wird nur eine Möglichkeit gezeigt 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000); 
        System.out.println("Entfernung:"+distanceKm+"Kilometer"---Anzahl der Knoten:"+route.getNumSteps()); 
        for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("Knoteninformationen:"+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //Diese beiden Methoden sind wie die obige Fahrplanauswahlmethode implementiert 
      @Override 
      public void aufGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //Erhalten Sie den Fußweg 
      } 
      @Override 
      public void aufGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //Erhalten Sie die Buslinien 
      } 
      @Override 
      public void aufGetBusDetailResult(MKBusLineResult arg0, int arg1) { 
      } 
      @Override 
      public void aufGetAddrResult(MKAddrInfo arg0, int arg1) { 
      } 
      @Override 
      public void aufGetSuggestionResult(MKSuggestionResult arg0, int arg1) { 
      } 
      @Override 
      public void aufGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { 
      } 
    }); 
    startNaviButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        String destination = destinationEditText.getText().toString(); 
        //Setzen Sie den Ausgangsort (aktuelle Position) 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //Setzen Sie den Bestimmungsort 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destination; 
        //Erweitern Sie die zu suchende Stadt 
        String city = getResources().getString(R.string.beijing); 
//       System.out.println("----"+city+"---"+Bestimmungsort+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        //Gehweg 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        //Öffentliche Verkehrsmittel 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  geschützt void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // Öffnen Sie den Kompass 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  geschützt void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation();//Aktuelle Position anzeigen 
    myLocationOverlay.disableCompass(); // Kompass schließen 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO Auto-generierter Methodenstummel 
    return false; 
  } 
  // Häufige Ereignisbehandlung, um typische Netzwerkfehler, Autorisierungsverifizierungsfehler usw. zu behandeln 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) { 
        Log.d("MyGeneralListener", "Fehler beim Abrufen des Netzwerkstatus ist "+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "Ihre Netzwerkverbindung ist fehlgeschlagen!", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "Fehler beim Abrufen des Berechtigungsstatus ist "+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // AutorisierungsKey-Fehler: 
          Toast.makeText(NavigationDemoActivity.this,  
              "Bitte geben Sie den richtigen AuthorisierungsKey in die Datei BMapApiDemoApp.java ein!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

Dann ist das Layout-Dokument:

<?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="Zielort:" /> 
    <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> 

AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.ericssonlabs" 
  android:versionCode="1" 
  android:versionName="1.0" > 
  <uses-sdk android:minSdkVersion="8" /> 
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
  <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
  <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
  <supports-screens android:largeScreens="true" 
    android:normalScreens="true" android:smallScreens="true" 
    android:resizeable="true" android:anyDensity="true"/> 
  <uses-sdk android:minSdkVersion="3></uses-sdk> 
  <application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
      android:name=".NavigationDemoActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN"> /> 
        <category android:name="android.intent.category.LAUNCHER"> /> 
      </intent-filter> 
    </activity> 
  </application> 
</manifest> 

上面就是实现百度地图定位和目的地导航的所有代码了,不知道是不是你们想要的呢?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来自网络,版权归原作者所有。内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发送邮件时,请将#替换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)

Vermutlich gefällt Ihnen