Androidプログラマへの道 〜 Moonlight 明日香 〜 - 現在地を表示する

Google Maps Android API v2

現在地を地図に表示するには, LocationClientクラスを利用する.

現在地の表示

  • MainActivity.java
    • LocationClientのイベントを取得するために, ConnectionCallbacks, OnConnectionFailedListener, LocationListenerインタフェースを使用する.
    • GoogleMapのインスタンスを取得する.
    • GoogleMap#setMyLocationEnabledメソッドで, 現在地取得を有効にする.
    • LocationClientのインスタンスを生成する.
    • LocationClient#connectメソッドで, Google Play Services接続する.
    • 正しく接続されるとonConnectedメソッドがコールされる
      • LocationClient#requestLocationUpdatesメソッドで, リクエストを投げる.
    • 位置が取得できると, onLocationChangedメソッドがコールされる.
      • CameraPosition#Builderメソッドで, 取得できた位置情報を使ってCamearaPositionのインスタンスを生成する.
      • GoogleMap#animateCameraメソッドで, 現在地に移動する.
package com.moonlight_aska.android.googlemapv2;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity
    implements OnConnectionFailedListener, LocationListener, ConnectionCallbacks {
  private GoogleMap mMap = null;
  private LocationClient mLocationClient = null;
  private static final LocationRequest REQUEST = LocationRequest.create()
    .setInterval(5000) // 5 seconds
    .setFastestInterval(16) // 16ms = 60fps
    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mMap = ( (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map) ).getMap();
    if (mMap != null) {
      mMap.setMyLocationEnabled(true);
    }
    mLocationClient = new LocationClient(getApplicationContext(), this, this); // ConnectionCallbacks, OnConnectionFailedListener
    if (mLocationClient != null) {
      // Google Play Servicesに接続
      mLocationClient.connect();
    }
  }

  @Override
  public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    // 現在地に移動
    CameraPosition cameraPos = new CameraPosition.Builder()
      .target(new LatLng(location.getLatitude(), location.getLongitude())).zoom(7.0f)
      .bearing(0).build();
    mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos));
  }

  @Override
  public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub
  }

  @Override
  public void onConnected(Bundle connectionHint) {
    // TODO Auto-generated method stub
    mLocationClient.requestLocationUpdates(REQUEST, this); // LocationListener
  }

  @Override
  public void onDisconnected() {
    // TODO Auto-generated method stub
  }
}
  • 動作例
SHARP SH-03C / Android 2.2

Google Maps Android v1 API

現在地を地図に表示するには, MyLocationOverlayクラスを利用する.

現在地の表示

  • MainActivity.java
Googleマップに現在地表示用のオーバーレイを重ねて表示するには, MapViewにオーバーレイを追加する.
    • MyLocationOverlayのインスタンスを生成する.
    • MyLocationOverlay#isMyLocationEnabledメソッドで現在地取得が有効かチェックし有効でない場合には, MyLocationOverlay#enableMyLocationメソッドで現在地取得を有効にする.
    • MapView#getOverlays#addメソッドで, オーバーレイを追加する.
    • MyLocationOverlay#runOnFirstFixメソッドで, 最初に位置情報が確定したときに実行するコードを実装する.
    • MyLocationOverlay#getMyLocationメソッドで, 現在地を取得し, MapController#animateToメソッドで現在値に移動する.
package com.moonlight_aska.android.web.googlemap03;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import android.os.Bundle;

public class MainActivity extends MapActivity {
  private MapView mView = null;
  private MapController mController = null;
  pivate MyLocationOverlay mOverlay = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mView = (MapView)findViewById(R.id.mapview);
    mController = mView.getController();
    mOverlay = new MyLocationOverlay(this, mView);
    // 現在地取得を有効に
    if (!mOverlay.isMyLocationEnabled()) {
      mOverlay.enableMyLocation();
    }
    mView.getOverlays().add(mOverlay);
    // 最初に位置情報が確定したときに実行するコード
    mOverlay.runOnFirstFix(new Runnable() {
      @Override
      public void run() {
        // TODO Auto-generated method stub
        // 現在地へ移動
        mController.animateTo(mOverlay.getMyLocation());
      }
    });
  }

  @Override
  protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
  }
}
  • 動作例
Nexus7 / Android 4.2