Android 10如何检测省电模式是否禁用了后台定位服务
Android 10 中等省电模式下后台定位服务可用性检测方案
Android 10 原生isPowerSaveMode()接口仅能检测是否开启极致省电模式,中等省电模式的状态确实不会通过该接口返回。同时中等省电模式对后台定位的限制属于系统临时策略限制,不会修改用户已授予的权限状态,因此checkSelfPermission检测ACCESS_BACKGROUND_LOCATION返回结果不受影响是符合系统预期的。
你可以通过以下几种方案检测后台定位服务是否可用:
- 方案1:结合定位provider状态判断
在已经获取后台定位权限的前提下,检测网络定位和GPS定位provider是否处于可用状态,中等省电模式下会自动禁用非白名单应用的后台定位provider:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean backgroundLocationAvailable = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED) { backgroundLocationAvailable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); } }
- 方案2:检测电池优化白名单状态
中等省电模式默认仅允许电池优化白名单内的应用使用后台定位,你可以通过PowerManager接口判断应用是否在白名单内,结合权限状态判断后台定位可用性:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); boolean isInBatteryWhitelist = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { isInBatteryWhitelist = powerManager.isIgnoringBatteryOptimizations(getPackageName()); }
- 方案3:主动发起定位请求验证
兼容性最高的方案是主动发起一次低功耗的单次定位请求,设置超时时间,超时未收到回调即可判定后台定位被系统限制:
// 使用谷歌定位服务示例,也可替换为系统LocationManager实现 FusedLocationProviderClient locationClient = LocationServices.getFusedLocationProviderClient(this); LocationRequest request = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_LOW_POWER) .setNumUpdates(1) .setInterval(1000); // 注册定位回调 LocationCallback callback = new LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { super.onLocationResult(locationResult); // 后台定位可用,后续执行对应逻辑 locationClient.removeLocationUpdates(this); } }; locationClient.requestLocationUpdates(request, callback, Looper.getMainLooper()); // 启动5秒超时定时器 new Handler(Looper.getMainLooper()).postDelayed(() -> { locationClient.removeLocationUpdates(callback); // 超时未收到回调,判定后台定位不可用 }, 5000);
注意:国内各厂商定制ROM对省电策略的修改较大,部分厂商的中等省电模式逻辑和原生系统差异明显,建议针对主流ROM做单独适配。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

