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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:36:01