Я разрабатываю приложение на основе местоположения, в котором я написал службу, которая запрашивает частые обновления местоположения с помощью LocationClient. Приложение показывает правильное текущее местоположение, когда мой пакет данных включен, но как только я переключаюсь на WiFi, приложение показывает неправильное местоположение (точнее, одно из моих старых местоположений).
Я запустил приложение с включенным пакетом данных (без WiFi), уходя в офис. Он показывал мое правильное местоположение, пока я не добрался до офиса. Добравшись до офиса, я переключился на WiFi. Когда я переключился на Wi-Fi, он начал показывать мой дом как мое текущее местоположение, несмотря на то, что я нахожусь в офисе. Переключение на пакет данных снова показало мое правильное местоположение.
Кто-нибудь сталкивался с подобными проблемами с LocationClient? Я боролся с этой проблемой последние два дня, но не смог найти решения или причины такого странного поведения LocationClient. Любая помощь будет действительно оценена.
Изменить Службу определения местоположения
public class LocationService extends Service implements LocationListener,
ConnectionCallbacks, OnConnectionFailedListener {
private LocationClient mLocClient;
private LocationRequest mLocRequest;
private IBinder mLocationServiceBinder = new LocationServiceBinder();
private Location mLocation;
private boolean mInProgress = false;
private final static int INTERVAL = 1 * 60 * 1000;
private final static int FASTEST_INTERVAL = 30 * 1000;
private final static int MINIMUM_DISTANCE = 100;
@Override
public void onCreate() {
super.onCreate();
mInProgress = false;
mLocRequest = LocationRequest.create();
mLocRequest.setInterval(INTERVAL);
mLocRequest.setFastestInterval(FASTEST_INTERVAL);
mLocRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocRequest.setSmallestDisplacement(MINIMUM_DISTANCE);
mLocClient = new LocationClient(this, this, this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(), "Service started",
Toast.LENGTH_SHORT).show();
setUpLocationClientIfNeeded();
if (!mLocClient.isConnected() || !mLocClient.isConnecting()
&& !mInProgress) {
mInProgress = true;
mLocClient.connect();
}
return Service.START_STICKY;
}
private void setUpLocationClientIfNeeded() {
if (mLocClient == null)
mLocClient = new LocationClient(this, this, this);
}
@Override
public IBinder onBind(Intent intent) {
return mLocationServiceBinder;
}
@Override
public void onDestroy() {
mInProgress = false;
if(mLocClient != null && mLocClient.isConnected()) {
mLocClient.removeLocationUpdates(this);
mLocClient.disconnect();
}
super.onDestroy();
}
@Override
public void onLocationChanged(Location location) {
//sending a broadcast to activity on location changed
}
// Create a binder class for communication with activity
public class LocationServiceBinder extends Binder {
public LocationService getService() {
return LocationService.this;
}
}
@Override
public void onConnectionFailed(ConnectionResult result) {
mInProgress = false;
}
@Override
public void onConnected(Bundle connectionHint) {
Log.i("Location Client", "Connected");
mLocClient.requestLocationUpdates(mLocRequest, this);
mLocation = mLocClient.getLastLocation();
queryParseForDealsAroundLocation(mLocation);
}
@Override
public void onDisconnected() {
mInProgress = false;
mLocClient = null;
Toast.makeText(getApplicationContext(), "Location Client disconnected",
Toast.LENGTH_SHORT).show();
Log.i("Location Client : ", "Disconnected");
}
}