【问题标题】:Getting more precise location获得更精确的位置
【发布时间】:2020-02-26 08:42:00
【问题描述】:

在我的 Android 应用程序中,我的目标设备范围为,

最低 Android 版本 - 7.1 (API 25)

目标 Android 版本 - 10.0 (API 29)

我正在使用以下逻辑来获取位置信息

权限使用

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

代码逻辑

 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
        return;
    }

    try {
        gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
         network_loc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (gps_loc != null) {
            final_loc = gps_loc;
            latitude = final_loc.getLatitude();
            longitude = final_loc.getLongitude();
        }
        else if (network_loc != null) {
            final_loc = network_loc;
            latitude = final_loc.getLatitude();
            longitude = final_loc.getLongitude();
        }
        else {
            latitude = 0.0;
            longitude = 0.0;
        }
    }

但大多数时候我无法通过 API 调用获得准确的位置。但是如果在设备级别(在电话中)启用以下选项,我将获得最准确的位置

有什么方法可以通过代码在应用程序级别配置上述设置。我正在工作的客户对手动更改配置不满意。

我想知道如何通过代码实现相同的目标。有人请帮忙。

【问题讨论】:

    标签: android google-location-services


    【解决方案1】:

    关于getLastKnownLocation(...)[From Document]你应该知道的一些事情

    从给定的提供程序获取最后一个已知位置,如果没有最后一个已知位置,则返回 null。在某些情况下,返回的位置可能很旧,因此应始终检查位置的年龄。

    这永远不会激活传感器来计算新位置,只会返回缓存的位置。


    请尝试locationManager.requestSingleUpdate(...),此方法将请求用户当前位置。

    if(locationManager.allProviders.contains(LocationManager.GPS_PROVIDER)) {
        locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, locListener)
    } else if(locationManager.allProviders.contains(LocationManager.NETWORK_PROVIDER)){
        locationManager.rerequestSingleUpdate(LocationManager.NETWORK_PROVIDER, locListener)
    }
    

    这是监听器。

    val locListener = object: LocationListener {
            override fun onLocationChanged(location: Location?) {
                // do something with updated location here.
            }
    
            override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
    
            override fun onProviderEnabled(provider: String?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
    
            override fun onProviderDisabled(provider: String?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
    
        }
    

    【讨论】:

    • 答案与问题无关,他问的是通过代码启用谷歌位置服务的wifi扫描。
    • 这确实有些道理,因为当您仅依赖 getLastKnownLocation() 时,您无法控制准确性,但如果您请求位置更新(或连续位置更新),您可以指定哪些提供者使用等。
    • 从 questuin 中,我认为他想要的是精确位置,所以我建议他使用 requestSingleUpdate(...),因为它有助于获取当前位置,而 getLastKnownLocation(...) 不能真正获取当前位置,有时它可以甚至为空。而当使用getLastKnownLocation(...)时,甚至不需要你打开定位。那么如何在不开启定位服务的情况下获得精确定位呢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多