Android 原生定位(替代高德 / 百度等三方定位)<终极版本>

上篇:免费替代高德 / 百度!Android 原生定位 + GeoNames 离线方案:精准经纬度与模糊位置工具包

接上篇

基于三方定位的融合定位收费问题做了分析,简单实现了定位和获取信息的功能.

这里对代码进行了整合,使功能更接近项目使用.

项目地址: LocationKit

网络库引用方式

arduino 复制代码
// GeoNames 获取信息兜底(可选)
implementation 'com.github.wukuiqing49:LocationAddress:v1.1.3'
// 获取定位信息
implementation 'com.github.wukuiqing49:Location:v1.1.3'

功能

  • 经纬度获取

  • 经纬度换算成位置信息

1: 获取经纬度

arduino 复制代码
// 获取定位信息
implementation 'com.github.wukuiqing49:Location:v1.1.3'

提供通过GPS_PROVIDER/NETWORK_PROVIDER/PASSIVE_PROVIDER/缓存位置信息 等多种方式获取Android定位信息的功能

1.1 提供获取经纬度配置信息
  • 获取经纬度方式

    • FAST 快速获取模式
    • FUSION 融合获取模式
    • SINGLE 单次获取模式
    • LOCATION_NET 网络获取模式
    • LOCATION_GPS GPS获取模式
  • 数据回调方式

    • 接口回调(默认)
    • useBroadcast广播回调
  • 默认位置配置

    • defaultLatitude 定位失败时的默认纬度(北京 39.9042)
    • defaultLongitude 定位失败时的默认经度(北京 116.4074)
  • timeout 超时时间配置

  • isFilter 是否开启抖动过滤

    • filterMin 跳变最小值
    • filterMax 跳变最大值
1.2 获取经纬度示例
scss 复制代码
// 动态构建 LocationConfig
val config = LocationConfig().apply {
    setLocationType(LocationType.FUSION) // 可根据需要选择模式
    setMinTimeMs(1000L)
    setMinDistanceM(1f)
    setFilter(true)
    setFilterMin(1f)
    setFilterMax(100f)
    setDefaultLatitude(39.90923)
    setDefaultLongitude(116.397428)
    setTimeout(5000L)
}

// 初始化 LocationKit
LocationKit.init(this, config)

// 启动定位
LocationKit.startLocation(this) { result ->
    lifecycleScope.launch {
        if (result.success && result.location != null) {

            val loc: Location? = result.location
            if (loc==null)return@launch
             // todo 获取经纬度
        } else {
            binding.tvLocation.text = "定位失败: ${result.msg}"
            binding.tvAddress.text = ""
        }
    }
}

2:获取位置信息

arduino 复制代码
// GeoNames 获取信息兜底
implementation 'com.github.wukuiqing49:LocationAddress:v1.1.3'

提供 Geocoder为主GeoNames数据库为辅助的方式,通过经纬度获取位置信息的功能

less 复制代码
// 获取 位置信息
val address = LocationResolverHelper.getAddress(this@LocationConfigTestActivity, loc.latitude, loc.longitude)
// 获取附近位置信息
val addressList = LocationResolverHelper.getNearbyAddresses(this@LocationConfigTestActivity, loc.latitude, loc.longitude)



/**
 * 位置信息数据结构
 * @param address 完整详细地址,可能为空
 * @param city 城市名称,例如 "北京市"
 * @param province 省/州,例如 "北京市" 或 "广东省"
 * @param country 国家名称,例如 "中国"
 * @param latitude 纬度
 * @param longitude 经度
 */
data class LocationInfo(
    val address: String?,
    val city: String?,
    val province: String?,
    val country: String?,
    val latitude: Double,
    val longitude: Double
)

3.测试机型

总结

通过Android原生代码的多种方式获取定位信息,从而摆脱收费的三方融合定位第一步.后期会继续维护.

注意点:

  • 此方案只针对经纬度位置信息简单需求生效
  • 国外环境未测试
  • 机型场景测试未足够测试

欢迎大家测试,反馈结果.

相关推荐
Starry-sky(jing)15 小时前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda
雨白16 小时前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
疯华整猫17 小时前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
传奇开心果18 小时前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin
Frankie_stand19 小时前
测试自动化实战指南:从脚本化、自动判据到 CI 集成的完整落地路径
android·ci/cd·自动化
恋猫de小郭20 小时前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
Kapaseker20 小时前
领导问我 Kotlin 的 Nothing 是什么?
android·kotlin
韩曙亮20 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
三少爷的鞋21 小时前
不改变异步本质,只改变代码组织:Telegram 项目的 Kotlin 协程实践
android