Этот код отлично работает в одном из моих проектов:
public class LocationManager {
private static LocationManager requestManager;
private FusedLocationProviderClient mLocationProviderClient;
private Location mLocation;
private Location mMyCurrentLocation;
private locationSuccessListener mListener;
public Location getLocation() {
return mLocation;
}
public void setLocation(Location location) {
mLocation = location;
}
private LocationManager(FusedLocationProviderClient fusedLocationProviderClient) {
this.mLocationProviderClient = fusedLocationProviderClient;
}
public static LocationManager createInstance(FusedLocationProviderClient fusedLocationProviderClient) {
if (requestManager != null) {
return requestManager;
} else {
return requestManager = new LocationManager(fusedLocationProviderClient);
}
}
public static LocationManager getInstance() {
return requestManager;
}
public void setLocation(Activity activity) {
mListener = (locationSuccessListener) activity;
LocationCallback callback = new LocationCallback();
LocationRequest locationRequest = new LocationRequest();
Task<Void> r = mLocationProviderClient.requestLocationUpdates(locationRequest, callback, Looper.getMainLooper());
r.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mLocationProviderClient.getLastLocation().addOnSuccessListener(activity, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
mMyCurrentLocation = location;
mLocation = location;
if (location != null) {
mListener.onLocationReceived();
mLocationProviderClient.removeLocationUpdates(callback);
}
}
});
}
});
}
public Location getMyCurrentLocation() {
return mMyCurrentLocation;
}
public interface locationSuccessListener {
void onLocationReceived();
}
Вам нужно сделать что-то вроде этого:
public class PlacesActivity extends SingleFragmentActivity implements NavigationView.OnNavigationItemSelectedListener, LocationManager.locationSuccessListener
и тогда в своей деятельности вы получите следующее:
@Override
public void onLocationReceived() {
Location l = LocationManager.getInstance().getMyCurrentLocation();
if (l==null){
Toast.makeText(this, "unable to get location", Toast.LENGTH_SHORT).show();
}
}
для получения разрешения вы должны сделать что-то вроде этого:
if (ContextCompat.checkSelfPermission(Objects.requireNonNull(getActivity()), Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
0);