WearOS 3.5 中 onSensorChanged() 未触发步数计数器和心率传感器回调,通常并非代码逻辑错误,而是系统级运行时权限未正确授予——尤其需手动启用“Sensors”“Physical Activity”及“Receive Complication Data”三项敏感权限。
wearos 3.5 中 `onsensorchanged()` 未触发步数计数器和心率传感器回调,通常并非代码逻辑错误,而是系统级运行时权限未正确授予——尤其需手动启用“sensors”“physical activity”及“receive complication data”三项敏感权限。
在 WearOS 3.5(如 Pixel 7)上,即使 AndroidManifest.xml 已声明 BODY_SENSORS 和 ACTIVITY_RECOGNITION 权限,系统仍要求用户在设置中显式开启对应功能权限。这与 Android 手机端的运行时权限模型不同:WearOS 将传感器访问细分为多个独立开关,且部分权限(如 Sensors)不会通过 requestPermissions() 弹窗提示,必须由用户主动进入系统设置开启。
✅ 正确配置步骤(缺一不可)
-
确保 Manifest 声明完整(已正确):
<uses-permission android:name="android.permission.BODY_SENSORS"></uses-permission><uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"></uses-permission><!-- 注意:WearOS 3.5+ 还建议添加 --><uses-permission android:name="android.permission.POST_NOTIFICATIONS"></uses-permission>
-
运行时检查并引导用户开启关键权限(推荐在 onCreate() 或首次启动时执行):
private void checkWearOSPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ 需额外检查通知权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, 101); } } // 检查 BODY_SENSORS(但注意:此检查可能返回 true,即使系统开关关闭) if (ContextCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "请在设置中启用体感传感器权限", Toast.LENGTH_LONG).show(); openWearOSPermissionSettings(); } } private void openWearOSPermissionSettings() { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } -
手动开启三项关键权限(用户操作路径):
⚠️ 这是最容易被忽略的核心步骤!
- 进入 Settings → Apps → [Your App] → Permissions
- 开启以下三项(名称可能略有差异,以实际系统语言为准):
- ✅ Sensors(启用后 TYPE_HEART_RATE 和 TYPE_STEP_COUNTER 才能上报数据)
- ✅ Physical Activity(必需用于 TYPE_STEP_COUNTER,尤其在后台或息屏时)
- ✅ Receive Complication Data(WearOS 3.5+ 新增权限,影响传感器事件分发链路)
? 验证与调试建议
-
使用 SensorManager.getSensorList() 确认传感器可用性:
List<sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_HEART_RATE); Log.d("SensorDebug", "HR Sensor count: " + sensors.size()); // 应输出 ≥1</sensor> 心率传感器需设备支持且佩戴贴合(松动/冷手可能导致无数据);步数计数器为累计值,首次读取后需重启应用或清零设备步数才能观察变化。
SENSOR_DELAY_NORMAL 对心率传感器效果不佳,建议使用 SENSOR_DELAY_FASTEST 或 SENSOR_DELAY_UI;但注意功耗权衡。
✅ 总结
WearOS 3.5 的传感器行为严格依赖系统级权限开关,而非仅 Manifest 声明或传统运行时请求。开发时务必:
- 在文档中明确告知用户需手动开启三项权限;
- 提供一键跳转至权限设置页的入口;
- 在 onSensorChanged() 中添加日志,区分是无回调(权限问题)还是回调但 event.values[0] == 0(硬件/佩戴问题)。
修复后,您的原始代码即可正常工作——无需修改注册逻辑或传感器类型判断。










