Android 原生定位方案:替代三方融合定位

716 阅读2分钟

原生定位之定位获取分析<一>

原生定位之系统代码获取定位<二>

原生定位之获取经纬度以及获取位置信息<三>

原生定位之终极版本动态配置获取定位信息<四>

Record_2025-08-28-14-56-47_396fb8cd39984d31f017dc6343f94d97 00_00_00-00_00_30.gif

image.png

Android 原生定位实现(替代融合定位收费,获取经纬度方案)

项目地址

测试Apk地址

接上篇.

上篇文章简单的梳理了一下国内手机获取经纬度,但是没经过大范围测试,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联系我都可以