ACCESS_COARSE_LOCATION权限在Android上提供了单元格塔精度

ACCESS_COARSE_LOCATION权限在Android上提供了单元格塔精度,第1张

概述我正在使用FusedLocationApi中的requestLocationUpdates()函数进行一些测试.我使用的是PRIORITY_BALANCED_POWER_ACCURACY.城市街区精度对我来说很好.当我申请ACCESS_FINE_LOCATION许可时,我得到了100米的精度,这对于GPS关闭是很好的.由于我不需要GPS精度但是城市块精度,我想只请

我正在使用FusedLocationAPI中的requestLocationUpdates()函数进行一些测试.我使用的是PRIORITY_BALANCED_POWER_ACCURACY.城市街区精度对我来说很好.

当我申请ACCESS_FINE_LOCATION许可时,我得到了100米的精度,这对于GPS关闭是很好的.由于我不需要GPS精度但是城市块精度,我想只请求ACCESS_COARSE_LOCATION权限.但是,当我请求ACCESS_COARSE_LOCATION权限时,我得到2公里的精度.看来该设备不再使用Wifi权限,只使用单元塔精度.

如何通过ACCESS_COARSE_LOCATION许可获得更好的精度?

注意:我的测试设备上禁用了GPS.

解决方法:

这是一个有趣的问题,我认为使用ACCESS_COARSE_LOCATION会使用WiFi,因为这就是文档所说的内容.

ACCESS_COARSE_LOCATION的文档说明:

Allows an app to access approximate location derived from network
location sources such as cell towers and 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.请注意,我还禁用了“始终允许扫描”,因为它指出:

Let Google Location Service and other applications scan for Wi-Fi
networks, even when Wi-Fi is off

因此,如果启用了结果,那肯定会扭曲结果.

请注意,我还在省电模式下为所有测试设置了位置模式,因此GPS收音机一直处于关闭状态.

以下是PRIORITY_BALANCED_POWER_ACCURACY,ACCESS_COARSE_LOCATION和无WiFi的结果:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021

因此,它表示2000米精度,这里是实际坐标的距离,绿色箭头显示我实际上在哪里:

然后,我启用了WiFi,再次运行测试,令人惊讶的是,结果完全相同!

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021

然后,我在LocationRequest中切换到LocationRequest.PRIORITY_LOW_POWER,同时在AndroIDManifest.xml中保留androID.permission.ACCESS_COARSE_LOCATION.

没有WiFi:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.40320943772021

有WiFi:

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" />

首次测试,没有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会让您的应用程序“捎带”到其他应用程序发出的位置请求.
从文档:

They will only be assigned power blame for the interval set by
setInterval(long), but can still receive locations triggered by other
applications at a rate up to setFastestInterval(long).

因此,如果用户打开Goog​​le地图,根据文档,您的应用可以在此时获得更准确的位置.这是使用新的Fused Location ProvIDer而不是旧API的主要方面之一,因为它可以减少您的应用程序的电池消耗量,而无需您做太多工作.

编辑:我对此功能进行了测试,以了解使用ACCESS_COARSE_LOCATION时会发生什么.

首次测试:ACCESS_COARSE_LOCATION,PRIORITY_BALANCED_POWER_ACCURACY和WiFi on:

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.38041129850662

这让我在水中,离我现在的位置很远.
然后,我退出了测试应用程序,启动了Google地图,它确切地定位了我,然后重新启动了测试应用程序.
测试应用程序无法从Google地图上捎带到该位置,结果与以前完全相同!

accuracy: 2000.0 lat: 37.78378378378378 lon: -122.38041129850662

我重新测试了几次,只是为了确定,但它看起来真的好像使用ACCESS_COARSE_LOCATION也会禁用应用程序“捎带”到其他应用程序获取的位置的能力.

看起来在AndroIDManifest.xml中使用ACCESS_COARSE_LOCATION会在获取精确位置数据方面严重削弱应用程序.

总而言之,您唯一能做的就是磨练适合您和您的应用程序的最佳设置组合,并希望此测试的结果可以帮助您做出决定.

总结

以上是内存溢出为你收集整理的ACCESS_COARSE_LOCATION权限在Android上提供单元格塔精度全部内容,希望文章能够帮你解决ACCESS_COARSE_LOCATION权限在Android上提供了单元格塔精度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1103170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存