如何在Wear OS(SDK 33/34)中检测省电模式是否开启?
Wear OS 中正确检测省电模式的方法
你用的这两种方法本身是Android平台的标准实现,但Wear OS有特殊的权限限制,才导致你遇到了失效问题。以下是具体原因和解决办法:
一、PowerManager.isPowerSaveMode 始终返回false的解决
- Wear OS 对第三方应用读取省电模式状态做了权限限制,默认情况下普通应用无法获取真实状态,必须申请对应权限。
- 操作步骤:
- 在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.POWER_SAVE_MODE" /> - 运行时动态申请权限(该权限属于危险权限,必须用户授权):
const val REQUEST_CODE_POWER_SAVE = 1001 // 在Activity或Fragment中调用 if (ContextCompat.checkSelfPermission(context, Manifest.permission.POWER_SAVE_MODE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this@YourActivity, arrayOf(Manifest.permission.POWER_SAVE_MODE), REQUEST_CODE_POWER_SAVE ) } - 等用户授权通过后,再调用
powerManager.isPowerSaveMode就能拿到正确的状态值了。
- 在
二、ACTION_POWER_SAVE_MODE_CHANGED 广播接收器不触发的解决
- 核心问题还是权限:未申请
POWER_SAVE_MODE权限时,接收器无法收到系统广播。 - 另外从Android 8.0(API 26)开始,静态注册的广播接收器无法接收这类系统广播,必须改为动态注册:
private val powerSaveReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (Intent.ACTION_POWER_SAVE_MODE_CHANGED == intent?.action) { val powerManager = context?.getSystemService(Context.POWER_SERVICE) as PowerManager val isPowerSaveOn = powerManager.isPowerSaveMode // 在这里处理省电模式切换后的逻辑 } } } // 在页面可见时注册广播 override fun onResume() { super.onResume() val filter = IntentFilter(Intent.ACTION_POWER_SAVE_MODE_CHANGED) registerReceiver(powerSaveReceiver, filter) } // 在页面不可见时注销广播,避免内存泄漏 override fun onPause() { super.onPause() unregisterReceiver(powerSaveReceiver) } - 同样要确保已经获取了
POWER_SAVE_MODE权限,否则动态注册也收不到广播。
三、额外提示
- 部分Wear OS设备有厂商定制的省电规则,建议优先在真实设备上测试,避免模拟器的状态偏差。
- 只有系统级应用可以跳过权限申请流程,普通第三方应用必须严格按上述步骤操作。
内容的提问来源于stack exchange,提问作者Michael Sorensen
相关产品推荐
相关产品推荐

