44

使用する

mMap.setMyLocationEnabled(true)

myLocationレイヤーを有効に設定できます。
しかし、問題は、ユーザーがボタンをクリックしたときにmyLocationを取得する方法です。経度と緯度を取得したい。

4

13 に答える 13

59

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を参照してください。

于 2014-05-29T22:17:36.677 に答える
31

現時点では、GoogleMap.getMyLocation()はあらゆる状況で常にnullを返します。

現在、Googleに関する2つのバグレポートがあります。私が知っているのは、Issue40932Issue4644です。

LocationListenerは、使用しようとしている新しいAPI内のLocationOverlayと同期していないため、以前に表示されたLocationListenerの実装は正しくありません。

以前にPramodJGeorgeによってリンクされたVogellaのサイトのチュートリアルに従うと、古いGoogleMapsAPIの方向性がわかります。

そのため、その方法で現在地を取得する方法を提供しなかったことをお詫び申し上げます。今のところ、locationListenerがそれを行う唯一の手段かもしれませんが、Googleは新しいAPI内で問題の修正に取り組んでいると確信しています。

また、これ以上リンクを投稿しなかったことをお詫びします。StackOverlowは、担当者がいないため、私はスパムだと考えています。

----2013年2月4日に更新----

Googleは、この問題は、 Issue4644を介したGoogleMapsAPIの次のアップデートで修正されると述べています。いつ更新されるかはわかりませんが、更新されたら、この投稿をもう一度編集します。

----2013年4月10日に更新----

Googleは、この問題は Issue4644で修正されたと述べています。これで動作するはずです。

于 2012-12-12T00:01:44.307 に答える
19

これを試して

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());
于 2013-01-24T03:16:30.730 に答える
3

デバイスの位置情報サービスがオンになっていることを確認してください。そうしないと、場所に関連する情報を取得できません。

これは私のために働きます、

    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);

}

于 2014-11-28T16:23:57.420 に答える
2

ユーザーがボタンをクリックしたときに場所を取得するには、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に設定されています。

これが機能するかどうか試してみてください...

于 2013-03-08T11:06:30.503 に答える
1

試しましたGoogleMap.getMyLocation()か?

于 2012-12-07T06:33:24.423 に答える
1

このコードスニペットはシンプルで機能的であることがわかりました。試してみてください。

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()));
    }
}}

チュートリアルのリンクは次のとおりです:最後の既知の場所の取得

于 2014-12-23T10:09:40.763 に答える
1

これを試して

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
    mMap.setMyLocationEnabled(true);
} else {
    // Show rationale and request permission.
}
于 2016-06-06T17:54:00.320 に答える
0

これを試して

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();

}
于 2012-12-07T07:03:53.573 に答える
0

現在地が表示されます。

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));
于 2014-09-30T14:11:55.270 に答える
0

唯一の条件は、nullではないことをテストしたことです。ユーザーが[現在地を取得]レイヤーボタンに触れるのに十分な時間を与えると、null値は取得されません。

于 2015-02-17T21:52:01.123 に答える
0

受け入れられた回答は機能しますが、使用されているメソッドの一部は廃止されたため、この質問に更新されたメソッドで回答するのが最善だと思います。

これは完全にグーグル開発者のこのガイドからの答えです

だからここにステップバイステップガイドがあります:

  1. これらすべてをマップアクティビティに実装します

    MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks

  2. あなたの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();
    }
    
  3. あなたのonConnected

    SupportMapFragment mapFragment = (SupportMapFragment)     getSupportFragmentManager()
            .findFragmentById(map);
    mapFragment.getMapAsync(this);
    
  4. あなたの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();
    }
    
  5. これら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);
    }
    }
    

これは非常に高速で、スムーズで効果的です。お役に立てれば

于 2017-04-09T08:26:43.810 に答える
0

非推奨になっている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

于 2017-07-04T14:14:11.093 に答える