Android 原生定位实现(替代融合定位收费,获取经纬度方案)
接上篇.
上篇文章简单的梳理了一下国内手机获取经纬度,但是没经过大范围测试,BugFactory这哥们提出可以搞个项目大家一起维护,提交测试的结果,然后再根据这个结果针对性的优化国内手机获取经纬度这一功能.
毕竟,三方融合定位早早的就开始收费了,各个资本家们是绝对能省则省的,所以早晚得遇到这种需求.
ok,那就来吧.
1:功能梳理
注意:
获取的是经纬度信息 ,不包含位置信息
通过系统代码,通过GPS,网络,系统最后缓存位置信息获取经纬度信息,三方融合定位的收费困局(有钱的融合定位好一点).
- GPS定位
- 网络定位
- 系统存储的最近的位置信息
2:功能实现
2.1 GPS获取经纬度
/**
* 多次获取GPS定位
*/
@SuppressLint("MissingPermission")
fun getGpsLocation() {
MethodLogger.logMethod()
if (!hasPermission()) return
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, minTimeMs, minDistanceM, this
)
isStartLocation = true
}
}
2.2 网络获取经纬度
/**
* 多次获取网络定位
*/
@SuppressLint("MissingPermission")
fun getNetLocation() {
MethodLogger.logMethod()
if (!hasPermission()) return
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, minTimeMs, minDistanceM, this
)
isStartLocation = true
}
}
2.3 系统缓存获取经纬度
/**
* 系统缓存获取经纬度
* @return Location?
*/
@SuppressLint("MissingPermission")
private fun getLastKnownLocation(): Location? {
MethodLogger.logMethod()
val providers = locationManager.getProviders(true)
var bestLocation: Location? = null
for (provider in providers) {
val l = locationManager.getLastKnownLocation(provider) ?: continue
if (bestLocation == null || l.accuracy < bestLocation.accuracy) {
bestLocation = l
}
}
return bestLocation
}
3:实现中的注意点
- 申请GPS权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
GPS室外获取相对容易网络定位室内获取相对容易
4:总结
在三方融合定位收费背景下,企业和开发者需要寻找成本更低且足够稳定的替代方案。本文实现了 多源定位获取机制,支持 GPS、网络和系统缓存方式,并提供了数据采集与开源协作的思路:
- 开发者可提交真实设备测试数据,形成可持续优化的数据库;
- 项目通过 GitHub/Gitee 表格 维护数据,便于快速迭代;
- 长期积累可形成国内设备定位兼容性参考,提升定位成功率与精度。
欢迎,大家提交测试结果,评论联系我或者issues联系我都可以