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
相关产品推荐
相关产品推荐

