这是一个有趣的问题,我的印象是 usingACCESS_COARSE_LOCATION
会使用 WiFi,因为这就是文档所说的。
状态的文档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" />
构建.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 无线电一直处于关闭状态。
以下是 、 和无 WiFi 的PRIORITY_BALANCED_POWER_ACCURACY
结果ACCESS_COARSE_LOCATION
:
accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021
所以,它说 2000 米的精度,这里是实际坐标有多远,绿色箭头显示我实际在哪里:
然后,我启用了WiFi,再次运行测试,结果竟然一模一样!
accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021
然后,我切换到LocationRequest.PRIORITY_LOW_POWER
同时LocationRequest
保留android.permission.ACCESS_COARSE_LOCATION
在 AndroidManifest.xml 中。
没有无线网络:
accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021
使用无线网络:
accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021
结果又是一模一样!using与 usingPRIORITY_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" />
第一次测试,没有WiFi:
accuracy: 826.0 lat: 37.7825458 lon: -122.3948752
所以,它说的准确度是 826 米,这是它在地图上的接近程度:
然后,我打开WiFi,结果如下:
accuracy: 18.847 lat: 37.779679 lon: -122.3930918
正如您在地图上看到的那样,它确实是正确的:
您在 Java 代码中使用的内容似乎并不重要LocationRequest
,而在 AndroidManifest.xml 中使用的权限更重要,因为这里的结果清楚地表明,在使用时ACCESS_FINE_LOCATION
,打开或关闭 WiFi 无线电对准确度,而且总体上也更准确。
看起来文档似乎有点误导,并且在使用android.permission.ACCESS_COARSE_LOCATION
时,当您的应用程序是唯一发出位置请求的应用程序时,打开或关闭 WiFi 无线电并没有什么不同。
文档指出的另一件事是,使用PRIORITY_BALANCED_POWER_ACCURACY
将使您的应用程序“搭载”其他应用程序发出的位置请求。从文档中:
它们只会在 setInterval(long) 设置的时间间隔内被分配电源责任,但仍可以接收由其他应用程序以高达 setFastestInterval(long) 的速率触发的位置。
因此,如果用户打开 Google 地图,根据文档,您的应用程序可以在该点获得更准确的位置。这是使用新的 Fused Location Provider 而不是旧 API 的主要优点之一,因为它可以减少应用程序的电池消耗量,而无需您做太多工作。
编辑:我对此功能进行了测试,看看使用ACCESS_COARSE_LOCATION
.
首次测试:ACCESS_COARSE_LOCATION
、PRIORITY_BALANCED_POWER_ACCURACY
和 WiFi 开启:
accuracy: 2000.0 lat: 37.78378378378378 lon: -122.38041129850662
这让我在水中,离我现在的位置很远。然后,我退出了测试应用程序,启动了谷歌地图,它准确地定位了我所在的位置,然后重新启动了测试应用程序。测试应用程序无法从谷歌地图捎带回位置,结果和以前完全一样!
accuracy: 2000.0 lat: 37.78378378378378 lon: -122.38041129850662
为了确定这一点,我重新测试了几次,但看起来使用ACCESS_COARSE_LOCATION
也禁用了应用程序“搭载”其他应用程序获得的位置的能力。
看起来ACCESS_COARSE_LOCATION
在 AndroidManifest.xml 中使用确实会在获取精确位置数据方面削弱应用程序。
总之,你唯一能做的就是磨练适合你和你的应用的最佳设置组合,希望这个测试的结果可以帮助你做出这个决定。