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

androidの位置情報と目的地のナビゲーションのサンプルコード

今日、技術の神様が百度地図を使って目的地ナビゲーションを実装したデモを見つけました。とても良いと思い、転載して共有します。以下に実装効果を見てみましょう:

       

アクセスすると最初に現在位置を取得し、地図上に表示されます。目的地を入力ボックスに入力すると、地図上に最適なルートが表示されます。ここでは、距離が最短の運転ルートを設定しています。また、バスルートや歩行ルートもあります。コードには詳細なコメントがあります。また、コンソールにはルート上の各ノードの情報および始点と終点の距離を出力しています。表示される情報は、現在のノードのナビゲーション情報です。以下の図のようにです:

 

次に実装方法を見てみましょう。まず、百度開発者アカウントを登録し、百度地図APIにアクセスして関連資料を確認します。百度地図APIの次に、地図に追加するアプリケーションにAPP KEYを登録します。登録が完了したら、百度地図jarファイルをダウンロードし、新しいプロジェクトを作成し、インポートしていただきます。以下に具体的なコードを実装する方法を見てみましょう。コードには詳細なコメントがあります:

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); 
    //現在位置レイヤーを取得 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //現在位置のレイヤーを地図のベースレイヤーに追加 
    mapView.getOverlays().add(myLocationOverlay); 
    // 位置情報イベントを登録 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location location) { 
        if (location != null){ 
          //GEOタイプの座標を生成し、地図上にその座標に対応する地点に位置付けます 
           pt = new GeoPoint((int)(location.getLatitude()*1e6), 
              (int)(location.getLongitude()*1e6)); 
//         System.out.println("---"+location.getLatitude() +:"+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }; 
    //検索モジュールを初期化 
    searchModel = new MKSearch(); 
    //ルート戦略を最短距離に設定 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      //ドライビングルートの取得コールバックメソッド 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // エラーコードはMKEventの定義を参照してください。 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // ここでは1つの案を例として示します 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 1000) +.+String.valueOf(distanceM % 1000); 
        System.out.println("距離:"+distanceKm+キロメートル---ノード数:+route.getNumSteps()); 
        for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("ノード情報:"+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //以下の2つの方法は上記の車両ルートの実現方法と同じです 
      @Override 
      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //歩行ルートの取得 
      } 
      @Override 
      public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //路線バスの取得 
      } 
      @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(); 
        //出発地(現在位置)を設定 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //目的地を設定 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destination; 
        //検索する都市を展開 
        String city = getResources().getString(R.string.beijing); 
//       System.out.println("----"+city+"---"+destination+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        //歩行路線 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        //バス路線 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  protected void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // 指南針を開く 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  protected void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation();//現在位置を表示する 
    myLocationOverlay.disableCompass(); // コンパスを閉じる 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO Auto-生成されたメソッドスタブ 
    return false; 
  } 
  // 一般的なイベントリスナー、通常のネットワークエラー、認証確認エラーなどを処理するために使用されます 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) { 
        Log.d("MyGeneralListener", "onGetNetworkStateエラーは "+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "ネットワークがエラーです!", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "onGetPermissionStateエラーは "+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // 認証キーエラー: 
          Toast.makeText(NavigationDemoActivity.this,  
              "BMapApiDemoApp.javaファイルに正しい認証キーを入力してください!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

次にレイアウトファイル:

<?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="目的地:" /> 
    <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#w までお送りください。3codebox.com(メールを送信する際、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、このサイトは侵害を疑う内容をすぐに削除します。)

基本教程
おすすめ