views:

488

answers:

1

Hi, I have this code to get the best available provider

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

locationListener = new MyLocationListener();
  Criteria criteria = new Criteria();
  criteria.setAccuracy(Criteria.ACCURACY_FINE);
  String provider = lm.getBestProvider(criteria, true);
  Location mostRecentLocation = lm.getLastKnownLocation(provider);
  if(mostRecentLocation!=null){
  latid=mostRecentLocation.getLatitude();
  longid=mostRecentLocation.getLongitude();
  }
  lm.requestLocationUpdates(provider, 1, 0, locationListener);

and then the listener

private class MyLocationListener implements LocationListener {

@Override
 public void onLocationChanged(Location loc) {
   if (loc != null) {
    latid = loc.getLatitude();
    longid = loc.getLongitude();
    // if(loc.hasAccuracy()==true){
    accuracyd = loc.getAccuracy();
    String providershown = loc.getProvider();    
    accuracy.setText("Location Acquired. Accuracy:"
      + Double.toString(accuracyd) + "m\nProvider: "+providershown);
    accuracy.setBackgroundColor(Color.GREEN);
    // }

    userinfo=usernamevalue+"&"+Double.toString(latid)+"&"+Double.toString(longid);
    submituserlocation(userinfo);
   }

  }

When I tested it to a device(htc magic) i found out that when gps is disabled it locks from the network immediatelly. When I enable the gps it doesnt take any data from the network and waits till it locks from the gps. I would like to lock the position like the google maps that until they have a good gps signal they use the network to determine my location. I though the best criteria would do that but what they do is pick a provider once. Is there something wrong with my code or I have to do threads and timeouts etc to make it happen? Thanks alot!

+1  A: 

Maybe you can try to listen to both the network provider and gps provider for a certain amount of time and then check the results from the two. If you don't have results from the gps, use the network results instead. That's how I did it.

M.A. Cape
So I make 2 location listeners, one for Gps and one for network and initialize them both with requestLocationUpdates. I can listen to them both then with one onLocationChanged?
spagi
Yes you should listen to both. You can even use lastKnownLocation before update comes from any provider.
Fedor
You can add a Location variable in your MyLocationListener and set its value within the onLocationChanged(). In your main activity, create two instance of MylocationListener, one is for the gps and one is for the network provider. Listen to both from a certain amount of time (you could implement this by creating a timer thread) and when the time is up, stop listening and check first the location variable in the gpslistener if there is any, else, check the networklistener.
M.A. Cape

related questions