Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android LocationListener Switching from GPS to Network

I have a Service implementing LocationListener listening for both GPS and Network.

The application is dependant on a constant location-feed, but it seems when GPS has a hard time getting a locationfix network location doesnt step in.

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 * 30,0, LocationReporterService.this);
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 60 * 2,0, LocationReporterService.this);

Questions
How do I make sure that I always get a location?
How can I make sure that if I dont get a GPS-location, I get a Network-location?
Is it a known bug?
Should I have 2 services, GPSLocationService and NetworkLocationsService?
Is there a solution to this? :)

like image 296
DagW Avatar asked Dec 27 '22 14:12

DagW


1 Answers

I agree with most of comments from AlexBottoni good answer, although in some points I can't suppot him.

Overview

First, just to check that you are doing it right...

You setup the same LocationListener for both providers. To indentify from where you are reciving the location you need to test it like this:

public void onLocationChanged(Location fix) {
    if(fix.getProvider().equals(LocationManager.GPS_PROVIDER)){
        //here Gps
    } else if(fix.getProvider().equals(LocationManager.NETWORK_PROVIDER)){
        //here Network
    }

Also, you setup a different acquisition frequency. Gps is providing a new location every 30 seconds and Network every 2 minutes.

As you didn't impose a minimum distance, you should receive a new Location from each one of the providers (as long as they can get a fix) with the frequency requested. If you don't receive a fix, is because they weren't able to acquire one.

Also, it may takes a little longer then requested to get the fix (mainly with Gps), because it may take some time to shyncronize with satellites and fix a location.

Fallback

There is no builted-in fallback from one provider to the other. They are independet, as said by Alex. I'm using the following approach to implement fallback:

  • Register Gps listener and start a timer
  • On every GPS location, restart timer
  • If timer reachs end, register Network listener (Gps listener keeps registered)
  • If new Gps location arrives, unregister Network listener, restart timer

Preferable Provider

Although Gps may not be available everyhere, is far most precise then Network. In my town, I get 6 meters accuracy with GPS and 1 Km with Network :-(

Two services

Doesn't matter where you register the listener, activity or service, separate ot together, as long as you request them and the provider can get a fix, you will get the location (assuming no bugs in application :-))

Final Notes

Ensure you have the permissions need (ACCESS_FINE_LOCATION, INTERNET, etc).

Ensure that phone setup have Network Location enabled (usually default is disable)

Most Gps receivers support updating information about satellite location, which improves fix time. You can use GPS Satus from the market, to do it.

Regards.

like image 67
Luis Avatar answered Jan 14 '23 10:01

Luis