これは以前に尋ねられたことを知っていますが、利用可能なすべてのソリューションでは、onLocationChanged()
メソッドを使用して座標を取得するためにgetLatitude()
およびgetLongitude()
メソッドを使用する必要があります。
ただし、デバイスの場所が変更されると、onLocationChanged()
が呼び出されます。したがって、現在の場所を取得するには、デバイスを移動する必要があります。
しかし、デバイスを移動せずに現在の座標を取得したいです。また、手動でonLocationChanged()
メソッドを呼び出すことができ、最後の既知の場所を取得できることを読んでいますが、
最後の既知の場所が現在の場所にならない可能性はありませんか?または、最後の既知の場所ソリューションを使用しても大丈夫ですか?
これは、LocationListenerを実装するために使用しているクラスの一部です。
_public class MyLocListener extends MapsActivity implements LocationListener {
public void onLocationChanged(Location location)
{
if(location!=null)
{
MapsActivity.setLatitude(location.getLatitude());
MapsActivity.setLongitude(location.getLongitude());
}
}}
_
これは、マップアクティビティに座標を提供するために使用している関数のオーバーライドです。緯度と経度は2つのdouble型変数です。このクラスでは、緯度と経度の変数は0で開始され、onLocationChanged()
関数は私の場所が変更されたときにのみ呼び出されるため、そのままです。したがって、地図上に現在の場所が表示されません。
_@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LocationManager myLocManager;
myLocManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
MyLocListener loc = new MyLocListener();
if (ActivityCompat.checkSelfPermission(this, Android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
myLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc);
LatLng sydney = new LatLng(latitude, longitude);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
_
GooglePlayServicesを使用する必要があります
compile 'com.google.Android.gms:play-services-location:7.0.0'
位置を取得するには
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
if (mGoogleApiClient != null) {
mGoogleApiClient.connect();
}
接続後
public class MainActivity extends ActionBarActivity implements
ConnectionCallbacks, OnConnectionFailedListener {
...
@Override
public void onConnected(Bundle connectionHint) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
}
}
}
詳細については、 documentation を確認してください。
変更した場所にコードを移動します。位置情報の取得は非同期であるため、緯度と経度が反映されることはありません。必要に応じて初期化を最適化します。
public class MyLocListener extends MapsActivity implements LocationListener {
public void onLocationChanged(Location location)
{
if(location!=null)
{
MapsActivity.setLatitude(location.getLatitude());
MapsActivity.setLongitude(location.getLongitude());
LatLng sydney = new LatLng(location.getLatitude(), location.getLongitude);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}}