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 слушателя, не только 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 недостаточно, потому что исправление может длиться очень долго !