API местоположения сервисов Google Play иногда дает неправильное местоположение

Мое приложение использует API службы Google Play, чтобы получить местоположение пользователя и проверить, находится ли устройство внутри или за пределами определенной области радиусом 50 м. Приложение использует PRIORITY_HIGH_ACCURACY и интервал в 1 минуту. Поэтому я создаю GoogleApiClient:

mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    mGoogleApiClient.connect();

В обратном вызове onConnected:

    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(60000);
    mLocationRequest.setFastestInterval(10000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

и

MyLocationListener.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mLocationListener);

Мое приложение также фильтрует местоположения на основе точности (если точность> 200 м, я отбрасываю его) и времени (если оно слишком старое, я отбрасываю его).

Приложение работает нормально, за исключением некоторых конкретных областей, где иногда оно возвращает неверное обновление местоположения примерно в 500 метрах от реального местоположения, и эти неправильные местоположения всегда находятся рядом с одним и тем же местом, в нескольких шагах от вышек сотовой связи.

В этих областях я получаю комбинацию неправильных и правильных местоположений, и мое приложение считает, что устройство иногда находится внутри, а иногда за пределами интересующей области.

Когда я получаю обновление местоположения, я жду, пока другие 3 подряд подтвердят позицию. Также я фильтрую местоположение, если оно точно такое же, как и предыдущее. Это означает, что когда я получаю эти ошибки, я получаю 4 неправильных местоположения подряд, каждое из которых немного отличается от других.

Есть ли способ предотвратить такое поведение? Может ли это быть вызвано вышкой сотовой связи?


person AleCat83    schedule 29.01.2016    source источник


Ответы (2)


Всегда есть шанс ошибиться. Точность 200 м не означает, что она находится в пределах 200 м — это означает, что с вероятностью 67% вы находитесь в пределах 200 м. Есть еще 1/3 шанса, что это не так.

Поскольку большинство провайдеров определения местоположения Google Play объединены (используют данные GPS и Wi-Fi / сотовой связи), да, находясь очень близко к башне, данные могут испортиться.

person Gabe Sechan    schedule 29.01.2016
comment
Итак, поскольку с помощью API-интерфейса Google Place невозможно отфильтровать сотового оператора, было бы лучше использовать старый API-адрес местоположения и слушать только провайдера GPS (если это не вопрос батареи)? - person AleCat83; 30.01.2016
comment
У вас все еще будут случайные блики, но это может быть более точным. Сотовые вышки на это не повлияют. Вы можете попробовать его и посмотреть, работает ли он лучше. Вы также можете попробовать отфильтровать существующие местоположения (вы уже отфильтровали низкоточные. Вы также можете отфильтровать большие прыжки или, по крайней мере, большие прыжки, которые не подтверждены следующим обновлением). - person Gabe Sechan; 30.01.2016
comment
на самом деле, когда я получаю обновление местоположения, я жду, пока другие 3 подряд подтвердят позицию. Также я фильтрую местоположение, если оно точно такое же, как и предыдущее. Это означает, что когда я получаю эти ошибки, я получаю 4 неправильных местоположения подряд, каждое из которых немного отличается от других. - person AleCat83; 30.01.2016
comment
Интересный. Это может быть либо вышка сотовой связи, искажающая показания, либо Google разместил вышку сотовой связи не в том месте. Попытка использования чистого GPS была бы, по крайней мере, хорошим шагом отладки. - person Gabe Sechan; 30.01.2016
comment
Я попробую и отпишусь о результатах. Таким образом, единственный способ получить местоположение только по GPS — использовать старый API местоположения Android, верно? С сервисом Google Place вы можете получить только слитный провайдер. - person AleCat83; 30.01.2016

Измените setInterval(60000) на setInterval(20000) или на 5000.

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

Согласно Google, setInterval(long) означает - установите интервал, в котором вы хотите получить местоположения. setFastestInterval(long) означает - если местоположение доступно раньше, вы сможете его получить (т. е. другое приложение использует службы определения местоположения. Означает, что если никакие другие приложения не используют службу определения местоположения, вы получите обновления только через минуту).

person Msp    schedule 29.01.2016
comment
Я уже пробовал некоторые комбинации интервалов, но это не решит проблему. Если устройство все еще находится в центре интересующей меня области, оно получает некоторые (большинство) местоположения рядом с истинным местоположением, а иногда (несколько) оно получает местоположения рядом с вышкой сотовой связи, даже если оно не двигается в течение нескольких часов. - person AleCat83; 30.01.2016