Last active
November 30, 2022 11:46
-
-
Save piyush-malaviya/463e7115a0051f765cdd404038d61cdd to your computer and use it in GitHub Desktop.
FusedLocationHelper class is used for requesting location for continuous location update or get only single time location update.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class FusedLocationHelper implements GoogleApiClient.OnConnectionFailedListener, ResultCallback<Status> { | |
private static final String TAG = FusedLocationHelper.class.getSimpleName(); | |
private Context context; | |
private GoogleApiClient googleApiClient; | |
private Location lastKnownLocation; | |
private LocationUpdateListener locationUpdateListener; | |
// location request parameter | |
private long interval = 0; // time in millisecond | |
private long fastestInterval = 0; // time in millisecond | |
private float smallestDisplacement = 0; // meter | |
private int priority = LocationRequest.PRIORITY_HIGH_ACCURACY; | |
private LocationListener locationListener = new LocationListener() { | |
@Override | |
public void onLocationChanged(Location location) { | |
Log.d(TAG, "onLocationChanged: " + location.toString()); | |
if (locationUpdateListener != null) { | |
locationUpdateListener.onLocationUpdate(location); | |
} | |
} | |
}; | |
private GoogleApiClient.ConnectionCallbacks continuousRequest = new GoogleApiClient.ConnectionCallbacks() { | |
@Override | |
public void onConnected(Bundle bundle) { | |
Log.d(TAG, "ContinuousRequest : onConnected"); | |
startLocationUpdates(); | |
} | |
@Override | |
public void onConnectionSuspended(int cause) { | |
Log.d(TAG, "ContinuousRequest : onConnectionSuspended = " + cause); | |
} | |
}; | |
private GoogleApiClient.ConnectionCallbacks singleRequest = new GoogleApiClient.ConnectionCallbacks() { | |
@Override | |
public void onConnected(Bundle bundle) { | |
Log.d(TAG, "SingleRequest : onConnected"); | |
getLastKnownLocation(); | |
} | |
@Override | |
public void onConnectionSuspended(int cause) { | |
Log.d(TAG, "SingleRequest : onConnectionSuspended = " + cause); | |
} | |
}; | |
public FusedLocationHelper(Context context) { | |
this.context = context; | |
} | |
public static boolean isLocationEnable(Context context) { | |
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); | |
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); | |
} | |
@Override | |
public void onConnectionFailed(ConnectionResult connectionResult) { | |
Log.d(TAG, "onConnectionFailed : " + connectionResult.getErrorMessage()); | |
} | |
private void setupGoogleApiClient(GoogleApiClient.ConnectionCallbacks connectionCallbacks) { | |
googleApiClient = new GoogleApiClient.Builder(context) | |
.addApi(LocationServices.API) | |
.addConnectionCallbacks(connectionCallbacks) | |
.addOnConnectionFailedListener(this) | |
.build(); | |
googleApiClient.connect(); | |
} | |
public FusedLocationHelper setInterval(long interval) { | |
this.interval = interval; | |
return this; | |
} | |
public FusedLocationHelper setFastestInterval(long fastestInterval) { | |
this.fastestInterval = fastestInterval; | |
return this; | |
} | |
public FusedLocationHelper setSmallestDisplacement(float smallestDisplacement) { | |
this.smallestDisplacement = smallestDisplacement; | |
return this; | |
} | |
public FusedLocationHelper setPriority(int priority) { | |
this.priority = priority; | |
return this; | |
} | |
public FusedLocationHelper setLocationUpdateListener(LocationUpdateListener locationUpdateListener) { | |
this.locationUpdateListener = locationUpdateListener; | |
return this; | |
} | |
public void stop() { | |
if (googleApiClient != null && googleApiClient.isConnected()) { | |
stopLocationUpdates(); | |
googleApiClient.disconnect(); | |
} | |
} | |
/** | |
* create location request | |
* | |
* @return instance of LocationRequest | |
*/ | |
private LocationRequest createLocationRequest() { | |
LocationRequest mLocationRequest = new LocationRequest(); | |
mLocationRequest.setInterval(interval); | |
mLocationRequest.setFastestInterval(fastestInterval); | |
mLocationRequest.setSmallestDisplacement(smallestDisplacement); | |
mLocationRequest.setPriority(priority); | |
return mLocationRequest; | |
} | |
public FusedLocationHelper requestSingleLocation() { | |
// set google api client | |
setupGoogleApiClient(singleRequest); | |
return this; | |
} | |
private void getLastKnownLocation() { | |
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { | |
return; | |
} | |
lastKnownLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); | |
if (lastKnownLocation != null) { | |
Log.d(TAG, "getLastKnownLocation : " + lastKnownLocation.toString()); | |
if (locationUpdateListener != null) { | |
locationUpdateListener.onLocationUpdate(lastKnownLocation); | |
} | |
googleApiClient.disconnect(); | |
} else { | |
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, createLocationRequest(), new LocationListener() { | |
@Override | |
public void onLocationChanged(Location location) { | |
Log.d(TAG, "getLastKnownLocation: onLocationChanged: " + location.toString()); | |
if (locationUpdateListener != null) { | |
locationUpdateListener.onLocationUpdate(location); | |
} | |
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this); | |
googleApiClient.disconnect(); | |
} | |
}); | |
} | |
} | |
public FusedLocationHelper requestContinuousLocation() { | |
// set google api client | |
setupGoogleApiClient(continuousRequest); | |
return this; | |
} | |
private void startLocationUpdates() { | |
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { | |
return; | |
} | |
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, createLocationRequest(), locationListener); | |
pendingResult.setResultCallback(this); | |
} | |
private void stopLocationUpdates() { | |
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { | |
return; | |
} | |
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, locationListener); | |
pendingResult.setResultCallback(this); | |
} | |
@Override | |
public void onResult(@NonNull Status status) { | |
Log.d(TAG, "PendingResult : " + status.getStatusMessage()); | |
} | |
public interface LocationUpdateListener { | |
void onLocationUpdate(Location location); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment