在 onInfoWindowClick 中获取当前位置
Get current Location in onInfoWindowClick
我想使用 onInfoWindowClick
中用户的当前位置。我在 onLocationChangend
中找到了位置,但是当我单击信息 window 时应用程序崩溃了,我不确定在 onInfoWindowClick
.[=15 中是否以正确的方式重新定位到当前位置=]
@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
第一个问题是您有一个空 Location 对象,因为您从未对其进行初始化。但是,由于 onLocationChanged()
为您提供了位置参考,因此无需转换为 LatLng 然后再转换回位置。
所以,只需使用一个成员变量,即 Location:
public class MainActivity extends AppCompatActivity
implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
Location mLocation;
//...............
然后只需在 onLocationChanged()
中设置您的 Location 成员变量。
此外,如果您想要获得多个位置更新以跟踪用户的移动,请删除取消注册位置更新的调用。
@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
不为null即可:
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 {
/*...*/
}
}
});
}
我想使用 onInfoWindowClick
中用户的当前位置。我在 onLocationChangend
中找到了位置,但是当我单击信息 window 时应用程序崩溃了,我不确定在 onInfoWindowClick
.[=15 中是否以正确的方式重新定位到当前位置=]
@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
第一个问题是您有一个空 Location 对象,因为您从未对其进行初始化。但是,由于 onLocationChanged()
为您提供了位置参考,因此无需转换为 LatLng 然后再转换回位置。
所以,只需使用一个成员变量,即 Location:
public class MainActivity extends AppCompatActivity
implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
Location mLocation;
//...............
然后只需在 onLocationChanged()
中设置您的 Location 成员变量。
此外,如果您想要获得多个位置更新以跟踪用户的移动,请删除取消注册位置更新的调用。
@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
不为null即可:
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 {
/*...*/
}
}
});
}