You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用minSdk23/targetSdk30获取当前位置API兼容问题求助

Android 跨版本实时位置获取兼容方案

方案1:使用JetPack官方兼容库(推荐,无需手动处理版本分支)

直接引入AndroidX封装的Location兼容库,内部已经自动适配了全版本的位置获取逻辑,既不会触发高版本废弃警告,也能覆盖低版本系统:

  • 首先在模块级build.gradle中添加依赖:
implementation "androidx.core:core-location:1.0.0"
  • 权限申请通过后直接调用兼容方法即可:
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
// 按需选择定位提供者:GPS_PROVIDER 或 NETWORK_PROVIDER
val locationProvider = LocationManager.GPS_PROVIDER
val cancelSignal = CancellationSignal()

LocationManagerCompat.getCurrentLocation(
    locationManager,
    locationProvider,
    cancelSignal,
    mainExecutor,
    { location ->
        // 此处获取到实时位置
    }
)

如果需要中途取消定位请求,调用cancelSignal.cancel()即可。

方案2:手动版本分支适配(无需引入额外依赖)

如果不想新增依赖,可以通过系统版本判断分别调用对应API,对低版本的废弃方法添加注解压制警告即可,不会导致编译失败:

val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
val locationProvider = LocationManager.GPS_PROVIDER

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // API 30+ 调用官方推荐方法
    val cancelSignal = CancellationSignal()
    locationManager.getCurrentLocation(
        locationProvider,
        cancelSignal,
        mainExecutor,
        { location ->
            // 获取实时位置
        }
    )
} else {
    // API <30 调用废弃方法,添加注解压制警告
    @Suppress("DEPRECATION")
    locationManager.requestSingleUpdate(
        locationProvider,
        object : LocationListener {
            override fun onLocationChanged(location: Location) {
                // 获取实时位置后主动移除监听,避免内存泄漏
                locationManager.removeUpdates(this)
            }
            override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) = Unit
            override fun onProviderEnabled(provider: String) = Unit
            override fun onProviderDisabled(provider: String) = Unit
        },
        Looper.getMainLooper()
    )
}

注意事项

  • 两种方案都需要提前完成位置权限的动态申请(ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION),同时需要判断用户是否开启了设备定位功能,否则会出现权限异常或拿不到位置的问题。
  • 不要使用getLastKnownLocation返回的缓存位置,不符合实时位置的需求。

内容的提问来源于stack exchange,提问作者jjakubowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:45:04