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

Exemplo de código de navegação de localização e destino no Android

Hoje, acidentalmente vi um grande gênio usar o Baidu Maps para localização e implementar o Demo de navegação para destino. Fiquei impressionado e decidi compartilhar. Abaixo, vamos ver o efeito da implementação:

       

Após entrar, você receberá a localização atual, que será exibida no mapa. Após inserir o destino na caixa de entrada, uma rota ótima aparecerá no mapa. Aqui, configurei a rota de direção mais curta. Além disso, há também rotas de ônibus e a pé, detalhadas no código. Além disso, informações sobre cada nó da rota, bem como a distância entre o ponto de partida e o destino, são exibidas no console. As informações mostradas são as informações de navegação no nó atual. Como mostrado na figura a seguir:

 

A seguir, vamos ver como é implementado, primeiramente, registre uma conta de desenvolvedor do Baidu e acesse a API do Baidu Maps para consultar os materiais relevantes. A API do Baidu Maps, em seguida, é registrar a chave APP para o aplicativo que precisa incluir o mapa, após o registro, baixe o arquivo jar do Baidu Maps, crie um novo projeto e importe-o. Abaixo está o código de implementação específico, onde há comentários detalhados:

public class NavigationDemoActivity extends MapActivity { 
  private String mMapKey = "registrar a chave de registro"; 
  private EditText destinationEditText = null; 
  private Button startNaviButton = null; 
  private MapView mapView = null; 
  private BMapManager mMapManager = null; 
  private MyLocationOverlay myLocationOverlay = null; 
  //Registra este listener no onResume, e Remove no onPause, observe que este listener não é do Android, é da API do 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); 
    //Configura para habilitar o controle de zoom integrado 
    mapView.setBuiltInZoomControls(true);  
    //Configura para que o overlay também seja exibido durante a animação de zoom, o padrão é não desenhar 
//    mapView.setDrawOverlayWhenZooming(true); 
    //Obter a camada da posição atual 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //Adicionar a camada da posição atual à camada inferior do mapa 
    mapView.getOverlays().add(myLocationOverlay); 
    // Registrar o evento de localização 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location location) { 
        if (location != null){ 
          //Gerar o tipo de coordenada GEO e localizar no mapa o ponto indicado pela coordenada 
           pt = new GeoPoint((int)(location.getLatitude()*1e6), 
              (int)(location.getLongitude()*1e6)); 
//         System.out.println("---"+location.getLatitude() +: "+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }; 
    //Inicializar o módulo de busca 
    searchModel = new MKSearch(); 
    //Definir a estratégia de rota para o menor distância 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      //Método de chamada de retorno para obter a rota de direção 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // O número de erro pode ser consultado nas definições de MKEvent 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "Desculpe, não foi encontrado nenhum resultado", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // Aqui apenas uma proposta é apresentada como exemplo 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 10 +,+String.valueOf(distanceM % 1000); 
        System.out.println("Distância:"+distanceKm+"quilômetros"---Número de nós:+route.getNumSteps()); 
        for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("Informações de nó:"+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //As duas formas a seguir são iguais à implementação da rota de direção 
      @Override 
      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //Obter rota a pé 
      } 
      @Override 
      public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //Obter linha de ônibus 
      } 
      @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(); 
        //Definir local de partida (posição atual) 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //Definir destino 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destino; 
        //Expandir a cidade de pesquisa 
        String cidade = getResources().getString(R.string.beijing); 
//       System.out.println("----"+cidade+"---"+destino+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        //Rota a pé 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        //Rota de ônibus 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  protected void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // Abra o compás 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  protected void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation();//Mostrar a localização atual 
    myLocationOverlay.disableCompass(); // Fechar o compás 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO Auto-esqueleto de método gerado 
    return false; 
  } 
  // Escuta de eventos comuns, usada para lidar com erros de rede comuns, verificações de autorização, etc. 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) { 
        Log.d("MyGeneralListener", "erro no estado da rede é "+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "Seu erro de rede!", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "erro no estado de permissão é "+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // Erro de chave de autorização: 
          Toast.makeText(NavigationDemoActivity.this,  
              "Por favor, insira a chave de autorização correta no arquivo BMapApiDemoApp.java!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

Então é o arquivo de layout:

<?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="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> 

Aqui está todo o código necessário para implementar a localização do mapa do Baidu e a navegação para o destino, não sei se é o que você quer.

Isso é tudo o que há no artigo, espero que ajude na sua aprendizagem e que você apoie mais o tutorial de gritaria.

Declaração: O conteúdo deste artigo é de propriedade da internet, pertence ao respectivo proprietário, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w3Aviso: O conteúdo deste artigo foi extraído da internet, pertence ao respectivo proprietário, o conteúdo foi contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w

Você também pode gostar