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

Exemple de code de navigation de localisation et d'arrivée Android

Aujourd'hui, j'ai vu par hasard un technicien expert utiliser Baidu Maps pour la localisation et la navigation vers la destination dans un exemple de démonstration. Cela m'a semblé très bien, donc je l'ai partagé ici. Voici les résultats de l'implémentation :

       

Après l'entrée, vous obtiendrez d'abord la position actuelle, qui sera affichée sur la carte. Après avoir saisi la destination dans le champ de saisie, une itinéraire optimal apparaîtra sur la carte. Ici, j'ai configuré un itinéraire de conduite avec la distance minimale. D'autres options, comme les itinéraires de transport en commun et les itinéraires piétons, sont également détaillées dans le code. De plus, les informations sur chaque noeud de l'itinéraire, ainsi que la distance entre le point de départ et le point d'arrivée, sont affichées dans la console. Les informations affichées sont les informations de navigation à ce noeud. Voici une illustration :

 

Ensuite, regardons comment cela est réalisé. D'abord, enregistrez un compte développeur Baidu, puis accédez à l'API Baidu Maps pour consulter les documents pertinents. Ensuite, enregistrez une clé APP pour l'application nécessitant l'intégration de la carte, téléchargez le fichier jar Baidu Maps, créez un nouveau projet et importez-le. Voici le code d'implémentation spécifique, avec des commentaires détaillés à l'intérieur :

public class NavigationDemoActivity extends MapActivity { 
  private String mMapKey = "enregistrer sa clé"; 
  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); 
    //Obtenir la couche de position actuelle 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //Ajouter la couche de position actuelle au plan inférieur de la carte 
    mapView.getOverlays().add(myLocationOverlay); 
    // Enregistrer l'événement de localisation 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location location) { 
        if (location != null){ 
          //Générer un type de coordonnées GEO et localiser la position indiquée par cette coordonnée sur la carte 
           pt = new GeoPoint((int)(location.getLatitude()*1e6), 
              (int)(location.getLongitude()*1e6)); 
//         System.out.println("---"+location.getLatitude() +:+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }; 
    //Initialiser le module de recherche 
    searchModel = new MKSearch(); 
    //Définir la stratégie de route pour la distance la plus courte 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      //Méthode de rappel de récupération de la route de conduite 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // Le numéro d'erreur peut être consulté dans les définitions de MKEvent 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "Désolé, aucun résultat trouvé", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // Ce n'est qu'un exemple pour montrer une seule solution 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 10 +,+String.valueOf(distanceM % 1000); 
        System.out.println("Distance : "+distanceKm+"kilomètres"---Nombre de nœuds :"+route.getNumSteps()); 
        for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("Informations sur le nœud : "+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //Les deux méthodes suivantes sont identiques à la méthode de mise en œuvre du plan de conduite précédent 
      @Override 
      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //Obtenir le itinéraire de piéton 
      } 
      @Override 
      public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //Obtenir le réseau de lignes de bus 
      } 
      @Override 
      public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { 
      } 
      @Override 
      public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 
      } 
      @Override 
      public void onGetSuggestionResult(MKSuggestionResult 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(); 
        //Définir le point de départ (position actuelle) 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //Définir la destination 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destination; 
        //Développer la recherche de ville 
        String city = getResources().getString(R.string.beijing); 
//       System.out.println("----"+city+"---"+destination+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        //Itinéraire à pied 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        //Ligne de bus 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  protected void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // Ouvrir le compas 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  protected void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation();//Afficher la position actuelle 
    myLocationOverlay.disableCompass(); // Fermer le compas de navigation 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO Auto-generé par le stub de méthode 
    return false; 
  } 
  // Écouteurs d'événements courants, utilisés pour traiter les erreurs réseau habituelles, les erreurs de validation d'autorisation, etc. 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) { 
        Log.d("MyGeneralListener", "erreur d'état du réseau est "+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "Votre réseau est en erreur !", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "erreur d'état de permission est "+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // Clé d'autorisation incorrecte : 
          Toast.makeText(NavigationDemoActivity.this,  
              "Veuillez saisir la clé d'autorisation correcte dans le fichier BMapApiDemoApp.java!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

Ensuite, le fichier de conception :

<?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="Démarrer la navigation"/> 
  <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> 

Voici tout le code pour réaliser la localisation de la carte Baidu et la navigation vers le point d'arrivée. Ne savez-vous pas si c'est ce que vous cherchez ?

C'est tout le contenu de cet article. J'espère que cela aidera à votre apprentissage et que vous soutiendrez également le tutoriel à crier.

Déclaration : le contenu de cet article est issu du réseau, propriété de l'auteur original, contribué et téléversé par les utilisateurs d'Internet, ce site ne détient pas de droits de propriété, n'a pas été traité par l'édition humaine et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)

Vous pourriez aussi aimer