Служба определения местоположения onProviderEnabled никогда не вызывается - PullRequest
1 голос
/ 23 июня 2011

У меня есть служба для обновления местоположения в моем приложении.Когда я запускаю свое приложение с отключенным GPS, возвращаюсь в меню Android и включаю GPS, и, наконец, возвращаюсь к своему приложению (служба не была уничтожена), onProviderEnabled никогда не вызывается.Кто-нибудь может помочь?

ОБНОВЛЕНИЕ: если я перезапущу приложение, поставщик включен.Только onProviderEnabled не вызывается ...

В каждом действии, в котором мне нужно местоположение, я делаю

super.onCreate(savedInstanceState); 

    //....

    // Bind location service
    bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE);

    //....

и

@Override
protected void onDestroy() {
    super.onDestroy();       
    // Unbind LocationService
    ItemDetail.this.unbindService(mConnection);
}

, а услуга

public class LocationService extends Service implements LocationListener {
    LocationManager locationManager; 

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {        
        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){         

            // Update after minimum 5 minutes and if user has moved at least 100 meters.
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this);        

            Location loc = getBestLocation(locationManager);
            if(loc!=null){
                GlobalVars.lat = (Double) (loc.getLatitude());
                GlobalVars.lng = (Double) (loc.getLongitude());
            }
        }
    }

    public void onLocationChanged(Location loc) {        
        GlobalVars.lat = (Double) (loc.getLatitude());
        GlobalVars.lng = (Double) (loc.getLongitude()); 
    }

    public static Location getBestLocation(LocationManager locationManager) {

        Location location_gps = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Location location_network = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        // If both are available, get the most recent
        if(location_gps!=null && location_network !=null) {
            return (location_gps.getTime() > location_network.getTime())?location_gps:location_network;
        }
        else if(location_gps==null && location_network ==null){
            return null;
        }
        else
            return (location_gps==null)?location_network:location_gps;

    }

    public void onProviderEnabled(String s){
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this); 
    }
    public void onProviderDisabled(String s){
        locationManager.removeUpdates(this);
        GlobalVars.lat = null;
        GlobalVars.lng = null;  
    }
    public void onStatusChanged(String s, int i, Bundle b){}

    @Override
    public void onDestroy() {       
        locationManager.removeUpdates(this);
    }
}

1 Ответ

2 голосов
/ 01 февраля 2013

В вашем методе LocationService.onCreate() ваш код проверяет, отключен ли поставщик GPS.

if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){...}

Но вы только начинаете подписку, если она уже включена. Обратите внимание, что ваш слушатель никогда не будет зарегистрирован на LocationManager и не будет получать никаких обновлений от отключенных или включенных поставщиков местоположения. Скорее измените свой onCreate() метод, чтобы всегда вызывать

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this);
...