C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

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




このページへのコメント

askaです.

> CameraPositionの下にあるtarget内で現在地の座標が決まっているのだと思っていますが、条件付きで初めの表示場所を任意の座標に変更することは可能でしょうか?

試してませんが, target(new LatLng(任意のLatitude, 任意のLongitude))とすれば, 可能なはずです.

Posted by aska 2015年02月05日(木) 22:20:27

わかりました。

もう1つ質問があるのですが、現在地の表示を行う際、
CameraPositionの下にあるtarget内で現在地の座標が決まっているのだと思っていますが、条件付きで初めの表示場所を任意の座標に変更することは可能でしょうか?

Posted by 初心者 2015年02月04日(水) 23:36:19

askaです.

SDK 6.5以上で試してないので, 以下のHPを参照してみてください.
「Google Play Service SDK 6.5でのLocationClientの代わりの実装は?」

Posted by aska 2015年02月04日(水) 23:02:19

import com.google.android.gms.location.LocationClient;の部分を
import com.google.android.gms.common.api.GoogleApiClient;に変更して
private LocationClient mLocationClient = null;を
private GoogleApiClient mLocationClient = null;に変更してみたのですが、

mLocationClient = new LocationClient(getApplicationContext(), this, this);の
new LocationClientの部分と
CameraPosition内のlocationにエラーがでています。

他にどこを変更すればいいのでしょうか?

Posted by 初心者 2015年02月03日(火) 23:57:44

Google Play Service SDKのバージョンが6.5以上になって使えなくなっているみたいです。
代わりにGoogleApiClientというのがあるそうなのですが、ここの「現在地を表示する」に当てはめて動作させるにはどうしたらよいのでしょうか?

Posted by 初心者 2015年02月03日(火) 14:59:50

コメントをかく


ユーザーIDでかく場合はこちら
「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます