requestLocationUpdates никогда не вызывается


Мне нужно мое фактическое положение в GPS только один раз. В этом коде onLocationChanged никогда не вызывается, я не понимаю, почему. Как я это называю:

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
Он должен работать каждые 0 секунд и каждые 0 метров. Как изменить код, чтобы он работал?
public class MapActivity extends FragmentActivity implements
        LocationListener {

    private final String TAG = getClass().getSimpleName();
    private GoogleMap mMap;
    private Location loc;
    private Context ctx;
    private radius;
    LocationManager mLocationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        ctx = MapActivity.this;
        radius = getRadius();

        mMap = initMap();

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        if (location != null) {
            loc = location;
            Log.v("Location Changed", location.getLatitude() + " and "
                    + location.getLongitude());
            mLocationManager.removeUpdates(this);
myPlaces = new GetPlaces(ctx, GAS_STATION, mMap, loc, radius);
        myPlaces.execute();
            Log.e(TAG, "location : " + loc);
        }
    }
    @Override
    public void onProviderDisabled(String provider) {
    }
    @Override
    public void onProviderEnabled(String provider) {
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

EDIT: я переместил вызов в loc:

myPlaces = new GetPlaces(ctx, GAS_STATION, mMap, loc, radius);
        myPlaces.execute();
            Log.e(TAG, "location : " + loc);

Внутри onLocationChange. Таким образом, я больше не получаю nullpointerException, но могу подождать более 20 секунд, чтобы получить местоположение. Это не так уж хорошо... Если у кого-нибудь есть идея как быстро получить исправление!

1 2

1 ответ:

Что я сделал, так это добавил 2 слушателя, не только gps, но и сеть перед onCreate:

Нашел код здесь: менеджер местоположения requestLocationUpdates вызывается только один раз

private final LocationListener gpsLocationListener =new LocationListener(){

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        final String tvTxt = textView.getText().toString();
        switch (status) {
        case LocationProvider.AVAILABLE:
            textView.setText(tvTxt + "GPS available again\n");
            break;
        case LocationProvider.OUT_OF_SERVICE:
            textView.setText(tvTxt + "GPS out of service\n");
            break;
        case LocationProvider.TEMPORARILY_UNAVAILABLE:
            textView.setText(tvTxt + "GPS temporarily unavailable\n");
            break;
        }
    }

    @Override
    public void onProviderEnabled(String provider) {
        textView.setText(textView.getText().toString()
                + "GPS Provider Enabled\n");
    }

    @Override
    public void onProviderDisabled(String provider) {
        textView.setText(textView.getText().toString()
                + "GPS Provider Disabled\n");
    }

    @Override
    public void onLocationChanged(Location location) {
        locationManager.removeUpdates(networkLocationListener);
        textView.setText(textView.getText().toString()
                + "New GPS location: "
                + String.format("%9.6f", location.getLatitude()) + ", "
                + String.format("%9.6f", location.getLongitude()) + "\n");
    }
};
private final LocationListener networkLocationListener =
                                                    new LocationListener(){

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras){
        final String tvTxt = textView.getText().toString();
        switch (status) {
        case LocationProvider.AVAILABLE:
            textView.setText(tvTxt + "Network location available again\n");
            break;
        case LocationProvider.OUT_OF_SERVICE:
            textView.setText(tvTxt + "Network location out of service\n");
            break;
        case LocationProvider.TEMPORARILY_UNAVAILABLE:
            textView.setText(tvTxt
                    + "Network location temporarily unavailable\n");
            break;
        }
    }

    @Override
    public void onProviderEnabled(String provider) {
        textView.setText(textView.getText().toString()
                + "Network Provider Enabled\n");
    }

    @Override
    public void onProviderDisabled(String provider) {
        textView.setText(textView.getText().toString()
                + "Network Provider Disabled\n");
    }

    @Override
    public void onLocationChanged(Location location) {
        textView.setText(textView.getText().toString()
                + "New network location: "
                + String.format("%9.6f", location.getLatitude()) + ", "
                + String.format("%9.6f", location.getLongitude()) + "\n");
    }
};

И активировать их в методах обратного вызова:

@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 0, 0,
            networkLocationListener);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            0, 0, gpsLocationListener);
}

@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(networkLocationListener);
    locationManager.removeUpdates(gpsLocationListener);
}

И тогда это сработало хорошо! Я думаю, что просто GPS недостаточно, потому что исправление может длиться очень долго !