API 23中locationManager.isProviderEnabled始终返回false问题求助
问题描述
在API 23的移动设备上跟踪GPS状态时,发现locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)方法出现异常:
- 应用启动时若已开启GPS,该方法返回
true; - 应用运行期间关闭GPS再重新开启后,方法始终返回
false; - 同时存在获取用户当前位置困难、Fused Location卡顿的情况。
已添加清单权限并完成权限申请:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>
核心代码片段:
LocationManager locationManager; boolean isEnabled; locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); isEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
解决方案
1. 监听GPS状态变化,替代单次查询
isProviderEnabled()仅做即时状态查询,无法主动感知GPS状态变更。需通过注册监听器或广播来跟踪状态变化:
方式一:注册GPS状态监听器
// 注册GPS状态监听器 locationManager.addGpsStatusListener(new GpsStatus.Listener() { @Override public void onGpsStatusChanged(int event) { switch (event) { case GpsStatus.GPS_EVENT_STARTED: isEnabled = true; break; case GpsStatus.GPS_EVENT_STOPPED: isEnabled = false; break; } } }); // 记得在页面销毁时移除监听器 // locationManager.removeGpsStatusListener(this);
方式二:监听系统位置模式变更广播
private BroadcastReceiver locationModeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (LocationManager.ACTION_LOCATION_MODE_CHANGED.equals(intent.getAction())) { int mode = intent.getIntExtra(LocationManager.EXTRA_LOCATION_MODE, LocationManager.LOCATION_MODE_OFF); isEnabled = mode == LocationManager.LOCATION_MODE_HIGH_ACCURACY; // 此处可更新UI或触发位置获取逻辑 } } }; // 在onCreate中注册广播 IntentFilter filter = new IntentFilter(LocationManager.ACTION_LOCATION_MODE_CHANGED); registerReceiver(locationModeReceiver, filter); // 在onDestroy中注销广播 // unregisterReceiver(locationModeReceiver);
2. 解决Fused Location卡顿问题
卡顿通常与请求参数、状态同步有关,可从以下几点优化:
- 发起位置请求时,设置高精度优先级及合理的更新间隔:
LocationRequest locationRequest = LocationRequest.create(); locationRequest.setPriority(Priority.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(10000); // 基础更新间隔10秒 locationRequest.setFastestInterval(5000); // 最快更新间隔5秒
- GPS重新开启后,需重新注册FusedLocationProviderClient的位置回调,避免旧请求挂起导致的卡顿;
- 避免在主线程处理位置回调逻辑,可切换至子线程处理后再更新UI。
3. API 23+权限校验
确保运行时已获取ACCESS_FINE_LOCATION权限,可在监听状态前添加校验:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); } else { // 权限已授权,执行状态监听或位置请求逻辑 }
内容的提问来源于stack exchange,提问作者coderror
相关产品推荐
相关产品推荐

