android - 获得更精确的位置
问题描述
在我的 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 调用获得准确的位置。但是如果在设备级别(在电话中)启用以下选项,我将获得最准确的位置
有什么方法可以通过代码在应用程序级别配置上述设置。我正在工作的客户对手动更改配置不满意。
我想知道如何通过代码实现相同的目标。有人请帮忙。
解决方案
你应该知道的一些事情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.
}
}
推荐阅读
- python - 在 gspread 中更新工作表名称的功能不起作用
- javascript - 如何让我们的动画一开始不执行,点击后才执行?
- php - pHp 问题:“等待本地主机”:可能是无限循环问题?
- python - Python 3 Pandas:计算列中出现相同的条目
- python - 对于一个简单的 API,我的 Pandas Read_JSON 出了什么问题?
- python - 我做了一个功能,在我的井字游戏中的每一步之后都会改变玩家,但它似乎不起作用
- automation - 运行 terraform init、terraform plan 或 apply 时出现无效字符错误
- python - Python:使用谷歌提供的代码段将视频上传到 youtube 不起作用
- spring-boot - 如何将我的 .graphqls 文件拆分为多个文件?
- nuxt.js - 在 Nuxt/Tailwind 项目中加载自定义字体