13

Я делаю некоторые тесты с помощью функции requestLocationUpdates() от FusedLocationApi. Я использую PRIORITY_BALANCED_POWER_ACCURACY. Точность городского квартала подходит для меня.Разрешение ACCESS_COARSE_LOCATION дает точность ячеек на Android

Когда я запрашиваю разрешение ACCESS_FINE_LOCATION, я получаю около 100-метровой точности, которая отлично сочетается с GPS. Поскольку мне не нужна точность GPS, но точность городского блока, я хотел бы запросить только разрешение ACCESS_COARSE_LOCATION. Однако, когда я запрашиваю разрешение ACCESS_COARSE_LOCATION, я получаю точность в 2 км. Похоже, что устройство больше не использует разрешение Wifi и только точность ячейки.

Как я могу получить лучшую точность с разрешением ACCESS_COARSE_LOCATION?

Примечание: GPS отключен на моем тестовом устройстве.

+0

Google строит модель местоположения путем сбора информации о точках доступа от пользователей, которые подключаются через Wi-Fi и сотовые вышки. Чем больше данных они собирают, тем лучше точность, поэтому технически вам понадобится больше пользователей Android в вашем регионе. С другой стороны, странно, что GPS может иметь точность порядка 100 м или 2 км для доступа грубо. Вы уверены, что не просчитались? – inmyth

+0

Точность GPS относительно измерителя. Я делаю все свои тесты с выключенным GPS. Устройство использует Wi-Fi, когда я использую разрешение ACCESS_FINE_LOCATION (у меня достаточно пользователей андроида в моей области). Я должен получить тот же результат при использовании ACCESS_COARSE_LOCATION вместо точности 2000 м. – poiuytrez

ответ

37

Это интересная проблема, и у меня создалось впечатление, что использование ACCESS_COARSE_LOCATION будет использовать Wi-Fi, так как это говорит документация.

Документация ACCESS_COARSE_LOCATION состояний:

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

Итак, я положил его на тест, и результаты удивили.

Вот код, который я использовал для тестирования с:

public class MainActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     if (mGoogleApiClient != null) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 

    protected synchronized void buildGoogleApiClient() { 
     Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show(); 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10); 
     mLocationRequest.setFastestInterval(10); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     //mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER); 
     //mLocationRequest.setSmallestDisplacement(0.1F); 

     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude()); 

     Toast.makeText(this,"Location Changed",Toast.LENGTH_SHORT).show(); 
    } 
} 

AndroidManifest.xml:

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

build.gradle:

compile 'com.google.android.gms:play-services:7.3.0' 

Первый тест, который я сделал с PRIORITY_BALANCED_POWER_ACCURACY и без WiFi. Обратите внимание, что я тоже инвалид Always Allow Scanning, так как в нем говорится:

Пусть Google Место службы и других приложений сканирования Wi-Fi сети, даже когда Wi-Fi выключен

Итак, что бы, конечно, перекосите результаты, если они были включены.

Обратите внимание, что у меня также был режим местоположения, установленный в режиме экономии заряда батареи для всех тестов, поэтому GPS-радио было отключено все время.

Вот результаты PRIORITY_BALANCED_POWER_ACCURACY, ACCESS_COARSE_LOCATION, и нет Wi-Fi:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021 

Так, он говорит, точность 2000 метра, а вот как далеко фактические координаты, зеленая стрелка показывает, где я на самом деле Я:

enter image description here

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

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021 

Затем я перешел на LocationRequest.PRIORITY_LOW_POWER в LocationRequest при сохранении android.permission.ACCESS_COARSE_LOCATION в AndroidManifest.xml.

Нет Wi-Fi:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021 

С Wi-Fi:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021 

Результаты были точно такими же, еще раз! Использование PRIORITY_LOW_POWER имело тот же результат, что и при использовании PRIORITY_BALANCED_POWER_ACCURACY, поскольку состояние WiFi не оказало никакого влияния на точность координат.

Затем, чтобы покрыть все основания, я изменил обратно LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY, и переключил AndroidManifest.xml к ACCESS_FINE_LOCATION:

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

Первый тест, нет Wi-Fi:

accuracy: 826.0 lat: 37.7825458 lon: -122.3948752 

Итак, он говорит о точности 826 метров, а вот как близко он был на карте:

enter image description here

Тогда я включен Wi-Fi, и вот результат:

accuracy: 18.847 lat: 37.779679 lon: -122.3930918 

Это буквально пятно на, как вы можете увидеть на карте:

enter image description here

кажется, что это имеет значение меньше того, что вы используете в своем LocationRequest в коде Java, и более того, какое разрешение вы используете в AndroidManifest.xml, так как результаты здесь ясно показывают, что при использовании ACCESS_FINE_LOCATION, включение и выключение радиостанции Wi-Fi сильно повлияло на точность, и это было также более урата в целом.

Конечно, похоже, что документация немного несовместима и что при использовании android.permission.ACCESS_COARSE_LOCATION наличие радиостанции Wi-Fi вкл. Или выкл. Не имеет значения, когда ваше приложение является единственным, кто делает запросы на размещение.

Еще одна вещь, о которой говорится в документации, заключается в том, что использование PRIORITY_BALANCED_POWER_ACCURACY позволит вашему приложению «копировать» на запросы местоположения, сделанные другими приложениями. Из документации:

Они будут назначены только мощности вину за интервал, установленный setInterval (длинный), но все еще может получить места, запускаемые другими приложений со скоростью до setFastestInterval (длинный) ,

Так что если пользователь открывает Карты Google, в соответствии с документацией ваше приложение может получить более точное местоположение в этой точке. Это одна из главных сторон использования нового поставщика Fused Location Provider, а не более старых API, поскольку он уменьшает количество утечки батареи вашего приложения без особых усилий с вашей стороны.

Редактировать: Я проверил эту функциональность, чтобы узнать, что произойдет при использовании ACCESS_COARSE_LOCATION.

Первый тест: ACCESS_COARSE_LOCATION, PRIORITY_BALANCED_POWER_ACCURACY и Wi-Fi на:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.38041129850662 

что поставил меня в воде, довольно далеко от моего текущего местоположения. Затем я вышел из тестового приложения, запустил Google Maps, который точно меня нашел, где я, а затем снова запустил тестовое приложение. Тестовое приложение не смогло выполнить обратную связь с местоположением с Карт Google, и результат был таким же, как и раньше!

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.38041129850662 

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

Похоже, использование ACCESS_COARSE_LOCATION в AndroidManifest.xml действительно калечит приложение с точки зрения получения точных данных о местоположении.

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

+0

Отличные тесты. Однако, я думаю, что вы ошибаетесь в своем последнем абзаце (до заключения). Если пользователь откроет Google Maps и наш запрос на приложения ACCESS_COARSE_LOCATION, мы (к сожалению) все равно получим 2000 м. Кажется, что система хотела бы «спрятать» более точное местоположение, чем 2000 м. – poiuytrez

+0

@poiuytrez Хорошо, я сделал предположение. Я думал, что координаты будут более точными, независимо от информации о точности. Я проверю это сегодня и обновляю результаты! –

+0

@poiuytrez Вы были правы, результаты тестов показывают, что эта функция не работает с 'ACCESS_COARSE_LOCATION'. Я обновил ответ с результатами тестов с сегодняшнего дня. –

0

Когда вы запрашиваете разрешение ACCESS_COARSE_LOCATION, клиент с плавным местоположением даст вам точность городского блока, это намеченное поведение, и оно написано в документации. Посмотрите here под «Укажите права приложения»
Что я могу предложить, так это то, что вы используете обычный провайдер местоположения для Android (не плавленого места) и пытаетесь получить доступ к поставщику сети NETWORK. Это должно дать вам точность WIFI.

+0

Из документации: «Точность уровня блока считается равной 100 м. Использование грубой точности, такой как это часто потребляет меньше энергии». Это должно быть точность 100 м, а не 2000 м. – poiuytrez

 Смежные вопросы

  • Нет связанных вопросов^_^