Проблемы с LocationClient

Я разрабатываю приложение на основе местоположения, в котором я написал службу, которая запрашивает частые обновления местоположения с помощью 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");
}

}


person Raeesaa    schedule 06.11.2013    source источник
comment
Не могли бы вы опубликовать код, сэр? Разве вы не используете GPS для получения точных результатов? Запрос обновления местоположения от GPS.   -  person Yauraw Gadav    schedule 06.11.2013
comment
Я использую LocationClient, который является частью нового API определения местоположения для Android. и он использует плавленый провайдер местоположения. Нам не нужно указывать GPS_PROVIDER или NETWORK_PROVIDER, как в случае LocationManager. Но я включил все службы определения местоположения в настройках.   -  person Raeesaa    schedule 06.11.2013
comment
Добавлен код. Я не думаю, что это было нужно для этого вопроса, но все же по вашей просьбе.   -  person Raeesaa    schedule 06.11.2013
comment
У меня также есть эта проблема с новым клиентом местоположения. Когда GPS недоступен, я получаю координаты WLAN с неправильным местоположением. Вам удалось как-то решить этот вопрос? Кажется, мы должны использовать старый добрый менеджер местоположений. Пожалуйста, проверьте также это обсуждение: stackoverflow.com/questions/18916273/   -  person Blehi    schedule 27.03.2014


Ответы (1)


Вы можете установить приоритет PRIORITY_HIGH_ACCURACY, но я думаю, что это довольно быстро разрядит батарею.

mLocRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

PRIORITY_HIGH_ACCURACY с большей вероятностью будет использовать GPS, а PRIORITY_BALANCED_POWER_ACCURACY с большей вероятностью будет использовать WIFI и позиционирование вышек сотовой связи. Если вы используете местоположение WIFI/вышки сотовой связи, вам придется мириться с некоторыми приблизительно неточными результатами.

Добавьте оба эти разрешения в свой манифест, я думаю, вы можете получить более качественные результаты.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
person Yauraw Gadav    schedule 06.11.2013
comment
Мой приоритет был установлен на PRIORITY_HIGH_ACCURACY до вчерашнего дня. Сегодня переключился на PRIORITY_BALANCED_POWER_ACCURACY. Была такая же проблема с высокой точностью. Насколько я знаю, Wi-Fi дает более точное местоположение по сравнению с мобильными сетями, это странное поведение меня бесит. - person Raeesaa; 06.11.2013