首页 > 解决方案 > 获得更精确的位置

问题描述

在我的 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 调用获得准确的位置。但是如果在设备级别(在电话中)启用以下选项,我将获得最准确的位置

在此处输入图像描述

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

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

标签: androidgoogle-location-services

解决方案


你应该知道的一些事情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.
        }

    }

推荐阅读