Created
March 2, 2017 18:48
-
-
Save shakil807g/c85ebbd435aef1cd2dde564809bbd708 to your computer and use it in GitHub Desktop.
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 LocationTrackerActivity extends AppCompatActivity implements | |
GoogleApiClient.ConnectionCallbacks, | |
GoogleApiClient.OnConnectionFailedListener, | |
LocationListener | |
{ | |
private static final String TAG = "LocationTrackerActivity"; | |
private static final int REQUEST_CHECK_SETTINGS = 0x1; | |
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 5000; | |
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = | |
UPDATE_INTERVAL_IN_MILLISECONDS / 2; | |
private GoogleApiClient mGoogleApiClient; | |
private LocationRequest mLocationRequest; | |
private LocationSettingsRequest mLocationSettingsRequest; | |
private String mLastUpdateTime; | |
private Location mCurrentLocation; | |
protected final PublishRelay<Location> relay = PublishRelay.create(); | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
Log.d(TAG, "onCreate: "); | |
buildGoogleApiClient(); | |
createLocationRequest(); | |
buildLocationSettingsRequest(); | |
} | |
public Location getmCurrentLocation(){ | |
if(mCurrentLocation!=null){ | |
return mCurrentLocation; | |
} | |
return null; | |
} | |
protected synchronized void buildGoogleApiClient() { | |
Log.i(TAG, "Building GoogleApiClient"); | |
mGoogleApiClient = new GoogleApiClient.Builder(this) | |
.addConnectionCallbacks(this) | |
.addOnConnectionFailedListener(this) | |
.addApi(LocationServices.API) | |
.build(); | |
} | |
protected void createLocationRequest() { | |
mLocationRequest = new LocationRequest(); | |
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); | |
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); | |
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); | |
} | |
protected void buildLocationSettingsRequest() { | |
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); | |
builder.addLocationRequest(mLocationRequest); | |
mLocationSettingsRequest = builder.build(); | |
} | |
protected void checkLocationSettingsAndStartLocationUpdates() { | |
PendingResult<LocationSettingsResult> result = | |
LocationServices.SettingsApi.checkLocationSettings( | |
mGoogleApiClient, | |
mLocationSettingsRequest | |
); | |
result.setResultCallback(new ResultCallback<LocationSettingsResult>() { | |
@Override | |
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { | |
final Status status = locationSettingsResult.getStatus(); | |
switch (status.getStatusCode()) { | |
case LocationSettingsStatusCodes.SUCCESS: | |
Log.i(TAG, "All location settings are satisfied."); | |
startLocationUpdates(); | |
break; | |
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: | |
Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" + | |
"upgrade location settings "); | |
try { | |
// Show the dialog by calling startResolutionForResult(), and check the result | |
// in onActivityResult(). | |
status.startResolutionForResult(LocationTrackerActivity.this, REQUEST_CHECK_SETTINGS); | |
} catch (IntentSender.SendIntentException e) { | |
Log.i(TAG, "PendingIntent unable to execute request."); | |
} | |
break; | |
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: | |
Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + | |
"not created."); | |
break; | |
} | |
} | |
}); // call on onResult | |
} | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, Intent data) { | |
switch (requestCode) { | |
// Check for the integer request code originally supplied to startResolutionForResult(). | |
case REQUEST_CHECK_SETTINGS: | |
switch (resultCode) { | |
case Activity.RESULT_OK: | |
Log.i(TAG, "User agreed to make required location settings changes."); | |
startLocationUpdates(); | |
break; | |
case Activity.RESULT_CANCELED: | |
Log.i(TAG, "User chose not to make required location settings changes."); | |
break; | |
} | |
break; | |
} | |
} | |
protected void startLocationUpdates() { | |
Log.d(TAG, "startLocationUpdates: "); | |
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { | |
return; | |
} | |
LocationServices.FusedLocationApi.requestLocationUpdates( | |
mGoogleApiClient, | |
mLocationRequest, | |
this //// call onLocationChanged | |
); | |
} | |
protected void stopLocationUpdates() { | |
LocationServices.FusedLocationApi.removeLocationUpdates( | |
mGoogleApiClient, | |
this | |
); | |
} | |
@Override | |
protected void onStart() { | |
super.onStart(); | |
if(mGoogleApiClient!=null) | |
mGoogleApiClient.connect(); | |
} | |
@Override | |
public void onResume() { | |
super.onResume(); | |
Log.d(TAG, "onResume: "); | |
if (mGoogleApiClient!=null && mGoogleApiClient.isConnected() ) { | |
Log.d(TAG, "onResume: mGoogleApiClient isConnected"); | |
checkLocationSettingsAndStartLocationUpdates(); | |
} | |
else if(mGoogleApiClient!=null && !mGoogleApiClient.isConnecting()) { | |
mGoogleApiClient.connect(); | |
} | |
} | |
@Override | |
protected void onPause() { | |
super.onPause(); | |
// Stop location updates to save battery, but don't disconnect the GoogleApiClient object. | |
if (mGoogleApiClient!=null && mGoogleApiClient.isConnected()) { | |
Log.d(TAG, "onPause: "); | |
stopLocationUpdates(); | |
} | |
} | |
@Override | |
protected void onStop() { | |
super.onStop(); | |
Log.d(TAG, "onStop: "); | |
if(mGoogleApiClient!=null) | |
mGoogleApiClient.disconnect(); | |
} | |
/** | |
* Runs when a GoogleApiClient object successfully connects. | |
*/ | |
@Override | |
public void onConnected(Bundle connectionHint) { | |
Log.i(TAG, "Connected to GoogleApiClient"); | |
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { | |
return; | |
} | |
mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); | |
if(mCurrentLocation!=null) | |
relay.accept(mCurrentLocation); | |
checkLocationSettingsAndStartLocationUpdates(); | |
} | |
@Override | |
public void onLocationChanged(Location location) { | |
Log.d(TAG, "onLocationChanged: "); | |
mCurrentLocation = location; | |
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); | |
if(mCurrentLocation!=null) | |
relay.accept(mCurrentLocation); | |
} | |
@Override | |
public void onConnectionSuspended(int cause) { | |
Log.i(TAG, "Connection suspended"); | |
} | |
@Override | |
public void onConnectionFailed(ConnectionResult result) { | |
Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment