上篇:免费替代高德 / 百度!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原生代码的多种方式获取定位信息,从而摆脱收费的三方融合定位第一步.后期会继续维护.
注意点:
- 此方案只针对经纬度位置信息简单需求生效
- 国外环境未测试
- 机型场景测试未足够测试
欢迎大家测试,反馈结果.