Reputation: 133
I am using Google Maps to obtain my current location and display a red marker on my location. So far it only the mMap.setMyLocation(true);
works for my location. I am getting NullPointerException for the object userLocation
towards the end of my code and the output to the console for userLocation
is null too.
How do I set the userLocation as soon as I load the map ?
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
LocationManager locationManager;
LocationListener locationListener;
LatLng userLocation;
private FusedLocationProviderClient mFusedLocationClient;
public float DEFAULT_ZOOM = 15f;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
userLocation = new LatLng(location.getLatitude(), location.getLongitude());
mMap.clear();
mMap.addMarker(new MarkerOptions().position(userLocation).title("Your Location"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(userLocation));
System.out.println("the latitude onLocationChanged is "+ userLocation.latitude);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
if (Build.VERSION.SDK_INT < 23) {
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
catch (SecurityException e){
e.printStackTrace();
}
} else {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
} else {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationListener);
// LatLng latLng = new LatLng(40.741895,-73.989308);
mMap.setMyLocationEnabled(true);
//outputs the latitude is null
System.out.println("the latitude is "+userLocation);
mMap.addMarker(new MarkerOptions().position(userLocation).title("Your Location"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(userLocation));
}
}
}
}
Upvotes: 0
Views: 81
Reputation: 1498
on method, OnMapReady use this code
if (!mMap.isMyLocationEnabled())
mMap.setMyLocationEnabled(true);
Location userLocation = getLocation();
and use this method to get the last location if you want it
public Location getLocation() {
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location myLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (myLocation == null) {
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
String provider = lm.getBestProvider(criteria, true);
myLocation = lm.getLastKnownLocation(provider);
}
return myLocation;
}
Note: GPS_PROVIDER
does not work indoors, so you should try it outdoor.
maybe you want to start the callback just if the last location before more than one minute. use this code
if (System.currentTimeMillis()-myLocation.getTime()>60000){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationListener);
};
Upvotes: 0
Reputation: 93542
You can't. Getting a location takes time. It won't be available until your callback is called, which means you can't load it until then. You could try calling getLastKnownLocation, but it will return null the majority of the time as well. The best solution is not to rely on it until the callback is made.
Upvotes: 3