Это интересная проблема, и у меня создалось впечатление, что использование 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](https://i.stack.imgur.com/tDS9B.png)
Затем я включил 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](https://i.stack.imgur.com/wxXEZ.png)
Тогда я включен Wi-Fi, и вот результат:
accuracy: 18.847 lat: 37.779679 lon: -122.3930918
Это буквально пятно на, как вы можете увидеть на карте:
![enter image description here](https://i.stack.imgur.com/vuuei.png)
кажется, что это имеет значение меньше того, что вы используете в своем 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 действительно калечит приложение с точки зрения получения точных данных о местоположении.
В заключение, единственное, что вы действительно можете сделать, это оттолкнуть лучшее сочетание настроек, которые работают для вас и вашего приложения, и, надеюсь, результаты этого теста помогут вам принять это решение.
Google строит модель местоположения путем сбора информации о точках доступа от пользователей, которые подключаются через Wi-Fi и сотовые вышки. Чем больше данных они собирают, тем лучше точность, поэтому технически вам понадобится больше пользователей Android в вашем регионе. С другой стороны, странно, что GPS может иметь точность порядка 100 м или 2 км для доступа грубо. Вы уверены, что не просчитались? – inmyth
Точность GPS относительно измерителя. Я делаю все свои тесты с выключенным GPS. Устройство использует Wi-Fi, когда я использую разрешение ACCESS_FINE_LOCATION (у меня достаточно пользователей андроида в моей области). Я должен получить тот же результат при использовании ACCESS_COARSE_LOCATION вместо точности 2000 м. – poiuytrez