【问题标题】:Get current Location in onInfoWindowClick在 onInfoWindowClick 中获取当前位置
【发布时间】:2015-10-05 16:52:42
【问题描述】:

我想使用onInfoWindowClick 中用户的当前位置。我在onLocationChangend 中获得了职位,但是当我单击信息窗口时应用程序崩溃了,我不确定在onInfoWindowClick 中以正确的方式引用当前位置。

@Override
public void onMapReady (GoogleMap map) {
    googleMap = map;
    setUpMap();
}

private void setUpMap() {
/*....*/
googleMap.setInfoWindowAdapter(new UserInfoWindowAdapter(getLayoutInflater()));
    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {

            LatLng markerPosition = marker.getPosition();
            Location myLocation;

            myLocation.setLatitude(myposition.latitude);
            myLocation.setLongitude(myposition.longitude);

            Location markerLoc = new Location("marker");
            markerLoc.setLatitude(markerPosition.latitude);
            markerLoc.setLongitude(markerPosition.longitude);

            float meters = myLocation.distanceTo(markerLoc);

            if (meters < 200) {
                /*...*/
            } else {
                /*...*/
            }
        }
    });
}

 @Override
public void onLocationChanged(Location location) {
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    myposition = new LatLng(location.getLatitude(), location.getLongitude());

    CameraPosition cameraPosition = new CameraPosition.Builder().target(myposition).zoom(14).build();
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}

我得到的错误是:

Attempt to invoke virtual method 'void android.location.Location.setLatitude(double)' on a null object reference

【问题讨论】:

  • 我的位置?尝试:myLocation = new Location(); ,然后为其设置经纬度

标签: android google-maps location google-maps-android-api-2


【解决方案1】:

第一个问题是你有一个空的 Location 对象,因为你从来没有初始化它。但是,由于onLocationChanged() 为您提供了位置参考,因此无需转换为 LatLng 然后再转换回位置。 所以,只需使用一个 Location 的成员变量:

public class MainActivity extends AppCompatActivity 
        implements OnMapReadyCallback,
        GoogleApiClient.ConnectionCallbacks, 
        GoogleApiClient.OnConnectionFailedListener, LocationListener {

        Location mLocation;
        //...............

然后只需将您的 Location 成员变量设置为 onLocationChanged()。 此外,如果您想要获得多个位置更新来跟踪用户的移动,请移除取消注册位置更新的调用。

@Override
public void onLocationChanged(Location location) {
    //LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    //myposition = new LatLng(location.getLatitude(), location.getLongitude());

    //add this:
    mLocation = location;

    CameraPosition cameraPosition = new CameraPosition.Builder().target(myposition).zoom(14).build();
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
} 

那么InfoWindowClickListener就被简化了,在使用前确保mLocation不为空即可:

googleMap.setInfoWindowAdapter(new UserInfoWindowAdapter(getLayoutInflater()));
    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {

            //null check, do nothing if current location is not known:
            if (mLocation == null) return;

            LatLng markerPosition = marker.getPosition();

            Location markerLoc = new Location("marker");
            markerLoc.setLatitude(markerPosition.latitude);
            markerLoc.setLongitude(markerPosition.longitude);

            float meters = mLocation.distanceTo(markerLoc);

            if (meters < 200) {
                /*...*/
            } else {
                /*...*/
            }
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多