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

Ejemplo de código de navegación de ubicación y destino en Android

Hoy, de manera casual, vi un demo de un experto en tecnología que utiliza Baidu Maps para localizar y realizar la navegación al destino. Me pareció muy bueno, así que lo compartí aquí para que todos lo vean. A continuación, veamos el efecto de la implementación:

       

Después de ingresar, primero obtendrá la ubicación actual, que se mostrará en el mapa. Después de ingresar el destino en el cuadro de entrada, aparecerá la ruta óptima en el mapa. Aquí he configurado la ruta de conducción con la distancia más corta. Además, también hay rutas de autobús y caminata, que se detallan en los comentarios del código. Además, en la consola, también se muestran las información de cada nodo en la ruta, así como la distancia desde el punto de partida y el destino, que se muestra como información de navegación en el nodo actual. Como se muestra en la siguiente imagen:

 

A continuación, veamos cómo se realiza, primero, registre una cuenta de desarrollador de Baidu y acceda a la documentación del API de Baidu Maps. Luego, registre la clave de aplicación APP para la aplicación que desea agregar al mapa. Después de registrarse, descargue el archivo jar de Baidu Maps, cree un proyecto nuevo e importe. A continuación, veamos el código específico de la implementación, que contiene comentarios detallados:

public class NavigationDemoActivity extends MapActivity { 
  private String mMapKey = "registrarse con su clave"; 
  private EditText destinationEditText = null; 
  private Button startNaviButton = null; 
  private MapView mapView = null; 
  private BMapManager mMapManager = null; 
  private MyLocationOverlay myLocationOverlay = null; 
  //En el momento de onResume se registra este listener, en el momento de onPause se necesita Eliminar, atención: este listener no es del sistema Android, es del API de Baidu 
  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); 
    //Se configura para habilitar el control deslizante de escala integrado 
    mapView.setBuiltInZoomControls(true);  
    //Al configurar el desplazamiento de la animación de escala también se muestra el overlay, por defecto no se dibuja 
//    mapView.setDrawOverlayWhenZooming(true); 
    //Obtener la capa de ubicación actual 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //Agregar la capa de la ubicación actual a la capa inferior del mapa 
    mapView.getOverlays().add(myLocationOverlay); 
    // Registrar eventos de ubicación 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location location) { 
        if (location != null){ 
          //Generar un punto GEO y ubicarse en el lugar indicado por el punto en el mapa 
           pt = new GeoPoint((int)(location.getLatitude()*1e6), 
              (int)(location.getLongitude()*1e6)); 
//         System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }); 
    //Inicializar el módulo de búsqueda 
    searchModel = new MKSearch(); 
    //Establecer la estrategia de ruta para la distancia más corta 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      //Método de retroalimentación de obtención de rutas de conducción 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // El número de error se puede consultar en las definiciones de MKEvent 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "Lo sentimos, no se encontraron resultados", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // Aquí se muestra solo una solución como ejemplo 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 1000) +.+String.valueOf(distanceM % 1000); 
        System.out.println("Distancia:",+distanceKm+kilómetros---número de nodos:+route.getNumSteps()); 
        for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("Información de nodo:",+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //Las dos siguientes formas son iguales a la implementación del plan de conducción anterior 
      @Override 
      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //obtener ruta a pie 
      } 
      @Override 
      public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //obtener línea de autobús 
      } 
      @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 destino = destinoEditText.getText().toString(); 
        //Establecer punto de partida (ubicación actual) 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //Establecer destino 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destino; 
        //Expandir la ciudad de búsqueda 
        String ciudad = getResources().getString(R.string.beijing); 
//       System.out.println("----"+ciudad+"---"+destino+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        //Ruta a pie 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        //Ruta de autobús 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  protected void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // Activar brújula 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  protected void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation();//Mostrar ubicación actual 
    myLocationOverlay.disableCompass(); // Cerrar brújula 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO Auto-metodo de plantilla generado 
    return false; 
  } 
  // Escucha de eventos comunes, utilizado para manejar errores de red comunes, errores de verificación de autorización, etc. 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) { 
        Log.d("MyGeneralListener", "error en el estado de red de obtención es ")+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "¡Su red tiene un error!", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "error en el estado de permiso de obtención es ")+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // Error de clave de autorización: 
          Toast.makeText(NavigationDemoActivity.this,  
              "¡Por favor, ingrese la clave de autorización correcta en el archivo BMapApiDemoApp.java!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

Luego está el archivo de diseño:

<?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="Destino:" /> 
    <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="Inicio de navegación"/> 
  <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-permiso android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
  <uses-permiso android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
  <uses-permiso android:name="android.permission.INTERNET"></uses-permission> 
  <uses-permiso android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
  <uses-permiso android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
  <uses-permiso android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
  <uses-permiso 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> 

Aquí está todo el código necesario para implementar la ubicación y navegación al destino del mapa de Baidu, ¿no es esto lo que querían?

Este es el contenido completo del artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de clamor.

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w.3Aviso: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando la evidencia relevante, y una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará