使用する
mMap.setMyLocationEnabled(true)
myLocationレイヤーを有効に設定できます。
しかし、問題は、ユーザーがボタンをクリックしたときにmyLocationを取得する方法です。経度と緯度を取得したい。
使用する
mMap.setMyLocationEnabled(true)
myLocationレイヤーを有効に設定できます。
しかし、問題は、ユーザーがボタンをクリックしたときにmyLocationを取得する方法です。経度と緯度を取得したい。
Google Maps APIの場所が機能するようになり、リスナーが含まれていても、それを使用して次のように実行できます。
private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
mMarker = mMap.addMarker(new MarkerOptions().position(loc));
if(mMap != null){
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
}
}
};
次に、マップのリスナーを設定します。
mMap.setOnMyLocationChangeListener(myLocationChangeListener);
これは、地図が最初に場所を見つけたときに呼び出されます。
LocationServiceやLocationManagerはまったく必要ありません。
OnMyLocationChangeListener
インターフェイスは非推奨です。代わりにcom.google.android.gms.location.FusedLocationProviderApiを使用してください。FusedLocationProviderApiは、位置検索と電力使用量を改善し、「現在地」の青い点で使用されます。サンプルコードのサンプルアプリケーションフォルダにあるMyLocationDemoActivity、またはLocationDeveloperGuideを参照してください。
現時点では、GoogleMap.getMyLocation()はあらゆる状況で常にnullを返します。
現在、Googleに関する2つのバグレポートがあります。私が知っているのは、Issue40932とIssue4644です。
LocationListenerは、使用しようとしている新しいAPI内のLocationOverlayと同期していないため、以前に表示されたLocationListenerの実装は正しくありません。
以前にPramodJGeorgeによってリンクされたVogellaのサイトのチュートリアルに従うと、古いGoogleMapsAPIの方向性がわかります。
そのため、その方法で現在地を取得する方法を提供しなかったことをお詫び申し上げます。今のところ、locationListenerがそれを行う唯一の手段かもしれませんが、Googleは新しいAPI内で問題の修正に取り組んでいると確信しています。
また、これ以上リンクを投稿しなかったことをお詫びします。StackOverlowは、担当者がいないため、私はスパムだと考えています。
----2013年2月4日に更新----
Googleは、この問題は、 Issue4644を介したGoogleMapsAPIの次のアップデートで修正されると述べています。いつ更新されるかはわかりませんが、更新されたら、この投稿をもう一度編集します。
----2013年4月10日に更新----
Googleは、この問題は Issue4644で修正されたと述べています。これで動作するはずです。
これを試して
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = service.getBestProvider(criteria, false);
Location location = service.getLastKnownLocation(provider);
LatLng userLocation = new LatLng(location.getLatitude(),location.getLongitude());
デバイスの位置情報サービスがオンになっていることを確認してください。そうしないと、場所に関連する情報を取得できません。
これは私のために働きます、
map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
map.setMyLocationEnabled(true);
GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange (Location location) {
LatLng loc = new LatLng (location.getLatitude(), location.getLongitude());
map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
}
};
map.setOnMyLocationChangeListener(myLocationChangeListener);
}
ユーザーがボタンをクリックしたときに場所を取得するには、onClick-でこのメソッドを呼び出します。
void getCurrentLocation() {
Location myLocation = mMap.getMyLocation();
if(myLocation!=null)
{
double dLatitude = myLocation.getLatitude();
double dLongitude = myLocation.getLongitude();
Log.i("APPLICATION"," : "+dLatitude);
Log.i("APPLICATION"," : "+dLongitude);
mMap.addMarker(new MarkerOptions().position(
new LatLng(dLatitude, dLongitude)).title("My Location").icon(BitmapDescriptorFactory.fromBitmap(Utils.getBitmap("pointer_icon.png"))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));
}
else
{
Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
}
}
また、
setMyLocationEnabled
trueに設定されています。
これが機能するかどうか試してみてください...
試しましたGoogleMap.getMyLocation()
か?
このコードスニペットはシンプルで機能的であることがわかりました。試してみてください。
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()));
}
}}
チュートリアルのリンクは次のとおりです:最後の既知の場所の取得
これを試して
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
// Show rationale and request permission.
}
これを試して
public class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc)
{
loc.getLatitude();
loc.getLongitude();
String Text = “My current location is: ” +
“Latitud = ” + loc.getLatitude() +
“Longitud = ” + loc.getLongitude();
Toast.makeText( getApplicationContext(),Text, Toast.LENGTH_SHORT).show();
tvlat.setText(“”+loc.getLatitude());
tvlong.setText(“”+loc.getLongitude());
this.gpsCurrentLocation();
}
現在地が表示されます。
mMap.setMyLocationEnabled(true);
Location userLocation = mMap.getMyLocation();
LatLng myLocation = null;
if (userLocation != null) {
myLocation = new LatLng(userLocation.getLatitude(),
userLocation.getLongitude());
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
mMap.getMaxZoomLevel()-5));
唯一の条件は、nullではないことをテストしたことです。ユーザーが[現在地を取得]レイヤーボタンに触れるのに十分な時間を与えると、null値は取得されません。
受け入れられた回答は機能しますが、使用されているメソッドの一部は廃止されたため、この質問に更新されたメソッドで回答するのが最善だと思います。
だからここにステップバイステップガイドがあります:
これらすべてをマップアクティビティに実装します
MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks
あなたのonCreate
:
private GoogleMap mMap;
private Context context;
private TextView txtStartPoint,txtEndPoint;
private GoogleApiClient mGoogleApiClient;
private Location mLastKnownLocation;
private LatLng mDefaultLocation;
private CameraPosition mCameraPosition;
private boolean mLocationPermissionGranted;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
context = this;
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */,
this /* OnConnectionFailedListener */)
.addConnectionCallbacks(this)
.addApi(LocationServices.API)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.build();
mGoogleApiClient.connect();
}
あなたのonConnected
:
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(map);
mapFragment.getMapAsync(this);
あなたのonMapReady
:
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Do other setup activities here too, as described elsewhere in this tutorial.
// Turn on the My Location layer and the related control on the map.
updateLocationUI();
// Get the current location of the device and set the position of the map.
getDeviceLocation();
}
これら2つは次のメソッドですonMapReady
:
private void updateLocationUI() {
if (mMap == null) {
return;
}
if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
}
if (mLocationPermissionGranted) {
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
} else {
mMap.setMyLocationEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
mLastKnownLocation = null;
}
}
private void getDeviceLocation() {
if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
}
if (mLocationPermissionGranted) {
mLastKnownLocation = LocationServices.FusedLocationApi
.getLastLocation(mGoogleApiClient);
}
// Set the map's camera position to the current location of the device.
float DEFAULT_ZOOM = 15;
if (mCameraPosition != null) {
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition));
} else if (mLastKnownLocation != null) {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(mLastKnownLocation.getLatitude(),
mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
} else {
Log.d("pouya", "Current location is null. Using defaults.");
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
mMap.getUiSettings().setMyLocationButtonEnabled(false);
}
}
これは非常に高速で、スムーズで効果的です。お役に立てれば
非推奨になっているFusedLocationApi
ので、私はむしろ使用したいと思います。OnMyLocationChangeListener
まず、次の3つの変数を宣言します。
private LocationRequest mLocationRequest;
private GoogleApiClient mGoogleApiClient;
private LocationListener mLocationListener;
メソッドを定義する:
private void initGoogleApiClient(Context context)
{
mGoogleApiClient = new GoogleApiClient.Builder(context).addApi(LocationServices.API).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks()
{
@Override
public void onConnected(Bundle bundle)
{
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(1000);
setLocationListener();
}
@Override
public void onConnectionSuspended(int i)
{
Log.i("LOG_TAG", "onConnectionSuspended");
}
}).build();
if (mGoogleApiClient != null)
mGoogleApiClient.connect();
}
private void setLocationListener()
{
mLocationListener = new LocationListener()
{
@Override
public void onLocationChanged(Location location)
{
String lat = String.valueOf(location.getLatitude());
String lon = String.valueOf(location.getLongitude());
Log.i("LOG_TAG", "Latitude = " + lat + " Longitude = " + lon);
}
};
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mLocationListener);
}
private void removeLocationListener()
{
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mLocationListener);
}
initGoogleApiClient()
GoogleApiClient
オブジェクトを初期化するために使用されますsetLocationListener()
場所変更リスナーを設定するために使用されますremoveLocationListener()
リスナーを削除するために使用されますメソッドを呼び出してコードの動作を開始します:)メモリリークの問題を回避するために、最後にinitGoogleApiClient
リスナー()を削除することを忘れないでください。mLocationListener