5

I want to know if there is a way in Android (GingerBread) to know if at the moment the GPS is doing something or not. Let me be a bit more clear: I basically want to call some method or api that will tell me wheter the GPS is:

1)Fixed (GPS icon in statusbar on)
2)Searching for fix (GPS icon on statusbar blinking)
3)Inactive (No app is using location services at the moment, no icon on statusbar)

Now: I know that you can use a LocationListener to be notified of such changes BUT this is not good for me because I don't want my code to remain running waiting waiting for events, my code runs periodically at scheduled times, does something and then terminates, so I need a way to check the status of the GPS service in that precise moment, rather than wait for notifications of when it changes.

Master_T
  • 7,232
  • 11
  • 72
  • 144
  • Maybe that helps? http://stackoverflow.com/a/3712727/1318830 – mkungla Mar 16 '13 at 19:21
  • I haven't tested that code, but by looking at it it appears to do the usual: subscribes and waits for a GPS Status Changed event. What I'd like to do is know the current status immediately, like call some method/api that will just return the current status and that's it. – Master_T Mar 16 '13 at 19:25
  • there is many answers in this row which in general give broader view how you can to it like http://stackoverflow.com/a/4084800/1318830 – mkungla Mar 16 '13 at 19:30
  • Mmm, that just seems to change the behaviour of the GPS icon in statusbar, which is not what I want... – Master_T Mar 17 '13 at 11:40
  • Possible duplicate of [How can I check the current status of the GPS receiver?](http://stackoverflow.com/questions/2021176/how-can-i-check-the-current-status-of-the-gps-receiver) – avalancha Nov 04 '15 at 16:19

2 Answers2

12

After doing lot of testing on GPS, finally I found the solution. When android app calls location manager and GPS starts searching, one event is triggered and also when gps is locked another event is triggered. Following code shows how to do this.

locationManager = (LocationManager)mContext.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isGPSEnabled) {                 
        if (locationManager != null) {
            // Register GPSStatus listener for events
            locationManager.addGpsStatusListener(mGPSStatusListener); 
            gpslocationListener = new LocationListener() {
                public void onLocationChanged(Location loc) {}
                public void onStatusChanged(String provider, int status, Bundle extras) {}
                public void onProviderEnabled(String provider) {}
                public void onProviderDisabled(String provider) {}                          
            };  

               locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                MIN_TIME_BW_UPDATES_GPS, MIN_DISTANCE_CHANGE_FOR_UPDATES_GPS,
                gpslocationListener);           
        }
    }

/* * This is GPSListener function invoked when various events occurs like * GPS started, GPS stopped, GPS locked */

public Listener mGPSStatusListener = new GpsStatus.Listener() {  
    public void onGpsStatusChanged(int event) {     
        switch(event) {
            case GpsStatus.GPS_EVENT_STARTED:
                Toast.makeText(mContext, "GPS_SEARCHING", Toast.LENGTH_SHORT).show();
                System.out.println("TAG - GPS searching: ");                        
                break;
            case GpsStatus.GPS_EVENT_STOPPED:    
                System.out.println("TAG - GPS Stopped");
                break;
            case GpsStatus.GPS_EVENT_FIRST_FIX:

                /*
                 * GPS_EVENT_FIRST_FIX Event is called when GPS is locked            
                 */
                    Toast.makeText(mContext, "GPS_LOCKED", Toast.LENGTH_SHORT).show();
                    Location gpslocation = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);

                    if(gpslocation != null) {       
                    System.out.println("GPS Info:"+gpslocation.getLatitude()+":"+gpslocation.getLongitude());

                    /*
                     * Removing the GPS status listener once GPS is locked  
                     */
                        locationManager.removeGpsStatusListener(mGPSStatusListener);                
                    }               

                break;
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
 //                 System.out.println("TAG - GPS_EVENT_SATELLITE_STATUS");
                break;                  
       }
   }
};  

It is better to put GPS code in and as service to get GPS location information.

Each time if you call GPS function, GPSStatus listener is registered. GPS_SEARCHING toast comes only once when GPS is started to search and GPS_LOCKED toast displays when GPS is locked. If we call GPS function again, GPS_EVENT_FIRST_FIX event is triggered if it is locked(displays GPS_LOCKED toast) and if GPS is already started to search it won't display GPS_SEARCHING toast(i.e GPS_STARTED event won't trigger). After GPS_EVENT_FIRST_FIX event is triggered i'm removing the GPSstatus listener updates.

When GPS_EVENT_FIRST_FIX event is triggered, its better to call gpslastknownlocation() function to get fresh latest GPS fix.(Its better to look into Android developers site for more info).

I hope this will help others....

mmBs
  • 8,421
  • 6
  • 38
  • 46
Sarweshkumar C R
  • 543
  • 1
  • 8
  • 19
  • I don't need this anymore and don't have time to test it, but I'll accept the answer, thanks for the time and effort. – Master_T Jan 03 '14 at 14:26
  • 2
    I want to trigger a function when GPS status is unlocked after being locked. How can I do that ? – ssrp Mar 04 '15 at 07:34
1

Unfortunately, there's no easy way to get the "current state" of the GPS in Android. Like others have pointed out, your best bet is to register for the onGpsStatusChanged() event and track the state.

If you are feeling adventurous, you can call call $ dumpsys location from an adb shell to get the state of the gps provider. You usually call $ adb shell from your desktop, but you can compile a native android shell app, and call an exec() from inside the shell to get the dumpsys output directly on the phone.

JonasVautherin
  • 7,297
  • 6
  • 49
  • 95
PowerPanda
  • 779
  • 5
  • 11