最終更新:
moonlight_aska 2013年09月23日(月) 19:01:02履歴
- 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
}
}
- 動作例

- MainActivity.java
- 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;
}
}
- 動作例

このページへのコメント
askaです.
> CameraPositionの下にあるtarget内で現在地の座標が決まっているのだと思っていますが、条件付きで初めの表示場所を任意の座標に変更することは可能でしょうか?
試してませんが, target(new LatLng(任意のLatitude, 任意のLongitude))とすれば, 可能なはずです.
わかりました。
もう1つ質問があるのですが、現在地の表示を行う際、
CameraPositionの下にあるtarget内で現在地の座標が決まっているのだと思っていますが、条件付きで初めの表示場所を任意の座標に変更することは可能でしょうか?
askaです.
SDK 6.5以上で試してないので, 以下のHPを参照してみてください.
「Google Play Service SDK 6.5でのLocationClientの代わりの実装は?」
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にエラーがでています。
他にどこを変更すればいいのでしょうか?
Google Play Service SDKのバージョンが6.5以上になって使えなくなっているみたいです。
代わりにGoogleApiClientというのがあるそうなのですが、ここの「現在地を表示する」に当てはめて動作させるにはどうしたらよいのでしょうか?