Android开发求助:不使用Location Manager,通过Fused Location Provider获取位置前如何检查GPS状态?
不用Location Manager检查GPS状态的可行方案(适配Fused Location Provider)
嘿,既然你正在用Fused Location Provider,那咱们就用Google Play Services生态里的方法来搞定GPS检查,完全不用碰Location Manager,给你两个实用方案:
方案一:快速检查位置服务总开关(含GPS是否可能启用)
这个方法适合快速判断用户是否开启了位置服务(不管是GPS还是网络定位),适配所有Android版本:
fun isLocationServiceEnabled(context: Context): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 用官方新增的简洁方法 Settings.Secure.isLocationEnabled(context.contentResolver) } else { // 低版本用传统的LOCATION_MODE判断 Settings.Secure.getInt( context.contentResolver, Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF ) != Settings.Secure.LOCATION_MODE_OFF } }
不过要注意:这个方法只能判断整体位置服务是否开启,如果用户开了位置但只启用网络定位(没开GPS),它也会返回true。如果需要精准检查GPS是否启用,看方案二。
方案二:精准检查GPS是否可用(适配Fused Location场景)
这个方法利用Fused Location配套的SettingsClient和LocationSettingsRequest,能准确判断GPS是否处于可用状态(包括是否需要用户手动开启),完全贴合你的开发场景:
代码实现
import com.google.android.gms.location.LocationRequest import com.google.android.gms.location.LocationServices import com.google.android.gms.location.LocationSettingsRequest import com.google.android.gms.location.ResolvableApiException fun checkGpsAvailability(context: Context, onResult: (isGpsAvailable: Boolean, resolvableException: ResolvableApiException?) -> Unit) { // 创建一个要求高精度定位的LocationRequest(这会触发GPS检查) val locationRequest = LocationRequest.create().apply { priority = LocationRequest.PRIORITY_HIGH_ACCURACY } // 构建LocationSettingsRequest,传入我们的定位需求 val settingsRequest = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest) .build() // 获取SettingsClient实例 val settingsClient = LocationServices.getSettingsClient(context) // 发起GPS状态检查 settingsClient.checkLocationSettings(settingsRequest) .addOnSuccessListener { // GPS已开启,且满足高精度定位需求 onResult(true, null) } .addOnFailureListener { exception -> if (exception is ResolvableApiException) { // GPS未开启,但可以通过系统弹窗引导用户开启 onResult(false, exception) } else { // GPS无法启用(比如设备不支持,或者用户永久拒绝权限) onResult(false, null) } } }
使用说明
- 当返回
isGpsAvailable = true时,直接调用Fused Location Provider获取位置即可; - 当返回
isGpsAvailable = false且resolvableException != null时,你可以调用exception.startResolutionForResult()(或者用Activity Result API的launch()方法),弹出系统自带的设置弹窗,引导用户开启GPS; - 别忘了在Manifest里添加必要权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
为什么推荐方案二?
- 和你正在用的Fused Location Provider完全兼容,不需要额外引入其他依赖;
- 能精准判断GPS是否满足高精度定位的要求,而不是仅仅检查开关;
- 提供了官方推荐的用户引导流程,体验更统一。
内容的提问来源于stack exchange,提问作者Shivam Bhasin
相关产品推荐
相关产品推荐

