Fused location API
suggest changeExample Using Activity w/ LocationRequest
/* * This example is useful if you only want to receive updates in this * activity only, and have no use for location anywhere else. */ public class LocationActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { private GoogleApiClient mGoogleApiClient; private LocationRequest mLocationRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mLocationRequest = new LocationRequest() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) //GPS quality location points .setInterval(2000) //At least once every 2 seconds .setFastestInterval(1000); //At most once a second } @Override protected void onStart(){ super.onStart(); mGoogleApiClient.connect(); } @Override protected void onResume(){ super.onResume(); //Permission check for Android 6.0+ if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if(mGoogleApiClient.isConnected()) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } } @Override protected void onPause(){ super.onPause(); //Permission check for Android 6.0+ if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if(mGoogleApiClient.isConnected()) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } } @Override protected void onStop(){ super.onStop(); mGoogleApiClient.disconnect(); } @Override public void onConnected(@Nullable Bundle bundle) { if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } @Override public void onConnectionSuspended(int i) { mGoogleApiClient.connect(); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } @Override public void onLocationChanged(Location location) { //Handle your location update code here } }
Example Using Service w/ PendingIntent and BroadcastReceiver
ExampleActivity
Recommended reading: LocalBroadcastManager
/* * This example is useful if you have many different classes that should be * receiving location updates, but want more granular control over which ones * listen to the updates. * * For example, this activity will stop getting updates when it is not visible, but a database * class with a registered local receiver will continue to receive updates, until "stopUpdates()" is called here. * */ public class ExampleActivity extends AppCompatActivity { private InternalLocationReceiver mInternalLocationReceiver; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //Create internal receiver object in this method only. mInternalLocationReceiver = new InternalLocationReceiver(this); } @Override protected void onResume(){ super.onResume(); //Register to receive updates in activity only when activity is visible LocalBroadcastManager.getInstance(this).registerReceiver(mInternalLocationReceiver, new IntentFilter("googleLocation")); } @Override protected void onPause(){ super.onPause(); //Unregister to stop receiving updates in activity when it is not visible. //NOTE: You will still receive updates even if this activity is killed. LocalBroadcastManager.getInstance(this).unregisterReceiver(mInternalLocationReceiver); } //Helper method to get updates private void requestUpdates(){ startService(new Intent(this, LocationService.class).putExtra("request", true)); } //Helper method to stop updates private void stopUpdates(){ startService(new Intent(this, LocationService.class).putExtra("remove", true)); } /* * Internal receiver used to get location updates for this activity. * * This receiver and any receiver registered with LocalBroadcastManager does * not need to be registered in the Manifest. * */ private static class InternalLocationReceiver extends BroadcastReceiver{ private ExampleActivity mActivity; InternalLocationReceiver(ExampleActivity activity){ mActivity = activity; } @Override public void onReceive(Context context, Intent intent) { final ExampleActivity activity = mActivity; if(activity != null) { LocationResult result = intent.getParcelableExtra("result"); //Handle location update here } } } }
LocationService
NOTE: Don’t forget to register this service in the Manifest!
public class LocationService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private GoogleApiClient mGoogleApiClient; private LocationRequest mLocationRequest; @Override public void onCreate(){ super.onCreate(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mLocationRequest = new LocationRequest() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) //GPS quality location points .setInterval(2000) //At least once every 2 seconds .setFastestInterval(1000); //At most once a second } @Override public int onStartCommand(Intent intent, int flags, int startId){ super.onStartCommand(intent, flags, startId); //Permission check for Android 6.0+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if (intent.getBooleanExtra("request", false)) { if (mGoogleApiClient.isConnected()) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, getPendingIntent()); } else { mGoogleApiClient.connect(); } } else if(intent.getBooleanExtra("remove", false)){ stopSelf(); } } return START_STICKY; } @Override public void onDestroy(){ super.onDestroy(); if(mGoogleApiClient.isConnected()){ LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, getPendingIntent()); mGoogleApiClient.disconnect(); } } private PendingIntent getPendingIntent(){ //Example for IntentService //return PendingIntent.getService(this, 0, new Intent(this, **YOUR_INTENT_SERVICE_CLASS_HERE**), PendingIntent.FLAG_UPDATE_CURRENT); //Example for BroadcastReceiver return PendingIntent.getBroadcast(this, 0, new Intent(this, LocationReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); } @Override public void onConnected(@Nullable Bundle bundle) { //Permission check for Android 6.0+ if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, getPendingIntent()); } } @Override public void onConnectionSuspended(int i) { mGoogleApiClient.connect(); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
LocationReceiver
NOTE: Don’t forget to register this receiver in the Manifest!
public class LocationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(LocationResult.hasResult(intent)){ LocationResult locationResult = LocationResult.extractResult(intent); LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("googleLocation").putExtra("result", locationResult)); } } }
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents