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

Xamarin Android三星Watch4 Wear OS心率传感器激活问题咨询

Xamarin.Android 三星Watch4(Wear OS)心率传感器采集失败修复方案

常见失败原因

  • 未声明/动态申请身体传感器权限:API 31(Android 12/Wear OS 3)中,心率数据属于用户敏感隐私数据,仅在清单文件声明权限无效,必须在运行时弹出系统授权弹窗,获得用户明确同意后才能访问传感器。
  • 未校验传感器注册结果:RegisterListener方法本身有布尔返回值,返回false代表注册失败,多数开发者忽略该返回值,无法定位权限不足、传感器被占用、参数不兼容等问题。
  • 硬件触发条件不满足:三星Watch4采用光电心率传感器,未佩戴、佩戴松动、传感器表面有污渍时,硬件会自动停止工作,不会上报任何有效数据;Wear OS模拟器不会自动生成心率数据,需要手动推送模拟值。
  • 接口实现不完整:ISensorEventListener接口要求实现OnAccuracyChanged回调,漏写该方法会导致部分Wear OS ROM上监听注册失效。
  • 采样率配置不合理:三星Watch4心率传感器硬件最高上报频率为1次/秒,设置SensorDelay.Fastest过高采样率会被系统直接拒绝注册。

清单文件权限配置

在AndroidManifest.xml中添加以下权限声明:

<!-- 前台访问心率传感器必需权限 -->
<uses-permission android:name="android.permission.BODY_SENSORS" />
<!-- 仅后台持续采集需要添加该权限,纯前台使用可删除 -->
<uses-permission android:name="android.permission.BODY_SENSORS_BACKGROUND" />

注意:Wear OS应用不支持在未打开应用时静默申请权限,首次启动必须主动引导用户授权

修正后的完整实现代码

using Android.Content.PM;
using Android.Hardware;
using Android.OS;
using AndroidX.Core.App;
using AndroidX.Core.Content;

[Activity(Label = "心率监测", MainLauncher = true)]
public class MainActivity : Activity, ISensorEventListener
{
    private SensorManager _sensorManager;
    private Sensor _heartRateSensor;
    private const int PERMISSION_REQUEST_BODY_SENSOR = 1001;

    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);

        _sensorManager = (SensorManager)GetSystemService(SensorService)!;
        _heartRateSensor = _sensorManager.GetDefaultSensor(SensorType.HeartRate);

        // 启动时先校验权限
        if (ContextCompat.CheckSelfPermission(this, Android.Manifest.Permission.BodySensors) != Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, 
                new[] { Android.Manifest.Permission.BodySensors }, 
                PERMISSION_REQUEST_BODY_SENSOR);
            return;
        }

        RegisterHeartRateListener();
    }

    private bool RegisterHeartRateListener()
    {
        if (_heartRateSensor == null) return false;
        // 最后一个参数设为0,关闭批量上报,实时返回数据
        return _sensorManager.RegisterListener(this, _heartRateSensor, SensorDelay.Normal, 0);
    }

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_BODY_SENSOR)
        {
            if (grantResults.Length > 0 && grantResults[0] == Permission.Granted)
            {
                bool registerResult = RegisterHeartRateListener();
                // registerResult为false时可提示用户传感器被占用或设备不支持
            }
        }
    }

    public void OnSensorChanged(SensorEvent? e)
    {
        if (e?.Sensor?.Type != SensorType.HeartRate) return;
        float heartRateValue = e.Values[0];
        // 数值为0时代表传感器未检测到有效佩戴,丢弃无效值
        if (heartRateValue <= 0) return;
        
        // 此处处理有效心率数据,heartRateValue单位为次/分钟
    }

    public void OnAccuracyChanged(Sensor? sensor, SensorStatus accuracy)
    {
        // 精度变化回调,必须实现,无特殊需求可留空
    }

    protected override void OnResume()
    {
        base.OnResume();
        // 回到前台时重新注册监听
        if (ContextCompat.CheckSelfPermission(this, Android.Manifest.Permission.BodySensors) == Permission.Granted)
        {
            RegisterHeartRateListener();
        }
    }

    protected override void OnPause()
    {
        base.OnPause();
        // 页面不可见时注销监听,减少不必要的耗电
        _sensorManager?.UnregisterListener(this);
    }
}

三星Watch4专属测试说明

  • 实体设备测试时需将手表紧贴手腕佩戴,避开纹身、伤疤位置,等待2-3秒传感器完成初始化后才会上报有效数据,悬空放置时永远返回0值。
  • 如果授权后仍然注册失败,进入手表「设置-应用-你的应用-权限」页面,手动确认「身体传感器」权限已开启,部分三星系统版本会默认拦截第三方应用的健康数据访问权限。
  • 模拟器测试时,打开模拟器侧边工具栏,找到「Virtual sensors」-「Heart rate」选项,手动调整心率数值滑块,才会触发OnSensorChanged回调。
  • 不要在应用后台长时间持有心率传感器监听,三星系统会对后台健康数据访问做强制限制,无活跃前台服务时会自动注销监听。

内容的提问来源于stack exchange,提问作者GertR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:47:07