Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get GPS location via a service in Android

I need to monitor user's locations using a background service, and then load them and show the path to the user.

Using an activity, it was quite easy to get GPS locations, but when I got to do it via a service, I came into a problem as it seems to only work for looper threads (or something like that).

As I've searched the internet for a solution, I've found out that many people got the same problem, but I couldn't find a working solution. Some people say that you need to use prepare->loop->quit , and some say you have to use a handlerThread, but still, I can't find out how to do such things in a proper way.

like image 813
android developer Avatar asked Jan 12 '12 00:01

android developer


People also ask

How do you get location data explain in detail?

Once you have Location object, you can use Geocoder. getFromLocation() method to get an address for a given latitude and longitude. This method is synchronous, and may take a long time to do its work, so you should call the method from the doInBackground() method of an AsyncTask class.

What is location based service in Android?

Location-Based Services(LBS) are present in Android to provide you with features like current location detection, display of nearby places, geofencing, etc. It fetches the location using your device's GPS, Wifi, or Cellular Networks.


2 Answers

public class GPSService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener {     private LocationRequest mLocationRequest;     private GoogleApiClient mGoogleApiClient;     private static final String LOGSERVICE = "#######";      @Override     public void onCreate() {         super.onCreate();         buildGoogleApiClient();         Log.i(LOGSERVICE, "onCreate");      }      @Override     public int onStartCommand(Intent intent, int flags, int startId) {         Log.i(LOGSERVICE, "onStartCommand");          if (!mGoogleApiClient.isConnected())             mGoogleApiClient.connect();         return START_STICKY;     }       @Override     public void onConnected(Bundle bundle) {         Log.i(LOGSERVICE, "onConnected" + bundle);          Location l = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);         if (l != null) {             Log.i(LOGSERVICE, "lat " + l.getLatitude());             Log.i(LOGSERVICE, "lng " + l.getLongitude());          }          startLocationUpdate();     }      @Override     public void onConnectionSuspended(int i) {         Log.i(LOGSERVICE, "onConnectionSuspended " + i);      }      @Override     public void onLocationChanged(Location location) {         Log.i(LOGSERVICE, "lat " + location.getLatitude());         Log.i(LOGSERVICE, "lng " + location.getLongitude());         LatLng mLocation = (new LatLng(location.getLatitude(), location.getLongitude()));         EventBus.getDefault().post(mLocation);      }      @Override     public void onDestroy() {         super.onDestroy();         Log.i(LOGSERVICE, "onDestroy - Estou sendo destruido ");      }      @Nullable     @Override     public IBinder onBind(Intent intent) {         return null;     }      @Override     public void onConnectionFailed(ConnectionResult connectionResult) {         Log.i(LOGSERVICE, "onConnectionFailed ");      }      private void initLocationRequest() {         mLocationRequest = new LocationRequest();         mLocationRequest.setInterval(5000);         mLocationRequest.setFastestInterval(2000);         mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);      }      private void startLocationUpdate() {         initLocationRequest();          if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {             // TODO: Consider calling             //    ActivityCompat#requestPermissions             // here to request the missing permissions, and then overriding             //   public void onRequestPermissionsResult(int requestCode, String[] permissions,             //                                          int[] grantResults)             // to handle the case where the user grants the permission. See the documentation             // for ActivityCompat#requestPermissions for more details.             return;         }         LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);     }      private void stopLocationUpdate() {         LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);      }      protected synchronized void buildGoogleApiClient() {         mGoogleApiClient = new GoogleApiClient.Builder(this)                 .addOnConnectionFailedListener(this)                 .addConnectionCallbacks(this)                 .addApi(LocationServices.API)                 .build();     }  } 
like image 34
vrbsm Avatar answered Oct 02 '22 18:10

vrbsm


I don't understand what exactly is the problem with implementing location listening functionality in the Service. It looks pretty similar to what you do in Activity. Just define a location listener and register for location updates. You can refer to the following code as example:

Manifest file:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application     android:icon="@drawable/ic_launcher"     android:label="@string/app_name" >     <activity android:label="@string/app_name" android:name=".LocationCheckerActivity" >         <intent-filter >             <action android:name="android.intent.action.MAIN" />             <category android:name="android.intent.category.LAUNCHER" />         </intent-filter>     </activity>     <service android:name=".MyService" android:process=":my_service" /> </application> 

The service file:

import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log;  public class MyService extends Service {      private static final String TAG = "BOOMBOOMTESTGPS";     private LocationManager mLocationManager = null;     private static final int LOCATION_INTERVAL = 1000;     private static final float LOCATION_DISTANCE = 10f;      private class LocationListener implements android.location.LocationListener {         Location mLastLocation;          public LocationListener(String provider) {             Log.e(TAG, "LocationListener " + provider);             mLastLocation = new Location(provider);         }          @Override         public void onLocationChanged(Location location) {             Log.e(TAG, "onLocationChanged: " + location);             mLastLocation.set(location);         }          @Override         public void onProviderDisabled(String provider) {             Log.e(TAG, "onProviderDisabled: " + provider);         }          @Override         public void onProviderEnabled(String provider) {             Log.e(TAG, "onProviderEnabled: " + provider);         }          @Override         public void onStatusChanged(String provider, int status, Bundle extras) {             Log.e(TAG, "onStatusChanged: " + provider);         }     }      LocationListener[] mLocationListeners = new LocationListener[]{             new LocationListener(LocationManager.GPS_PROVIDER),             new LocationListener(LocationManager.NETWORK_PROVIDER)     };      @Override     public IBinder onBind(Intent arg0) {         return null;     }      @Override     public int onStartCommand(Intent intent, int flags, int startId) {         Log.e(TAG, "onStartCommand");         super.onStartCommand(intent, flags, startId);         return START_STICKY;     }      @Override     public void onCreate() {         Log.e(TAG, "onCreate");         initializeLocationManager();         try {             mLocationManager.requestLocationUpdates(                     LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,                     mLocationListeners[1]);         } catch (java.lang.SecurityException ex) {             Log.i(TAG, "fail to request location update, ignore", ex);         } catch (IllegalArgumentException ex) {             Log.d(TAG, "network provider does not exist, " + ex.getMessage());         }         try {             mLocationManager.requestLocationUpdates(                     LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,                     mLocationListeners[0]);         } catch (java.lang.SecurityException ex) {             Log.i(TAG, "fail to request location update, ignore", ex);         } catch (IllegalArgumentException ex) {             Log.d(TAG, "gps provider does not exist " + ex.getMessage());         }     }      @Override     public void onDestroy() {         Log.e(TAG, "onDestroy");         super.onDestroy();         if (mLocationManager != null) {             for (int i = 0; i < mLocationListeners.length; i++) {                 try {                     mLocationManager.removeUpdates(mLocationListeners[i]);                 } catch (Exception ex) {                     Log.i(TAG, "fail to remove location listners, ignore", ex);                 }             }         }     }      private void initializeLocationManager() {         Log.e(TAG, "initializeLocationManager");         if (mLocationManager == null) {             mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);         }     } } 
like image 112
avepr Avatar answered Oct 02 '22 20:10

avepr