如何在Android Wearable中访问心率传感器?

12

我在使用Moto 360时遇到了访问心率传感器的问题。

我尝试了以下方法:

Sensor mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
mSensorManager.registerListener(this, mHeartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);

然后实现SensorEventListener接口:

@Override
public void onSensorChanged(SensorEvent event) {

        String TAG = "tag";
        Log.i(TAG, "--------------------------");
        Log.i(TAG, msg);
        Log.i(TAG, ""+ event.sensor.getType());
        Log.i("live","--------------");

对我来说很奇怪的是,我完全没有收到任何消息(不仅仅是心率)。

我还尝试列出所有传感器,但列表中没有显示心率传感器。

当然,我已经添加了权限。

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.watchtest" >

<uses-feature android:name="android.hardware.type.watch" />
<uses-permission android:name="android.permission.BODY_SENSORS" />

有任何想法吗?

谢谢。

w.


1
你尝试过更新SDK吗?链接 - Kent
2
我同意肯特的观点,确保你的SDK是最新的,有人遇到了类似的问题并解决了:http://stackoverflow.com/questions/25820771/having-trouble-reading-heart-rate-sensor-from-moto-360-android-wear#comment41398670_26322757 - Murphy
@Kent 这个项目与SDK有什么关联吗?因为我安装了最新的SDK,但它并没有工作。但是当我创建了一个新项目时,它开始工作了。 - wonglik
我也遇到了同样的问题。我在短时间内得到了一些数值,然后它又返回相同的数值一分钟左右,接着给我一些不同的数值,然后再次停止。看起来这是Moto 360的普遍问题。 - Asle Benjamin Kinnerød
4个回答

6

在我做了以下操作后,这个问题被解决:

  1. Uninstalled my app from the watch with

    adb -s localhost:4444 uninstall com.example.android.wearable.jumpingjack
    
  2. Added permissions to get the heart rate sensor

    <uses-permission android:name="android.permission.BODY_SENSORS"/>
    
  3. Set the min and target SDK version to match the watch

    android:minSdkVersion="20" android:targetSdkVersion="20"
    

重新启动了应用程序。我使用Sensor.TYPE_HEART_RATE获取到心率传感器,并开始接收其读数。尽管这些读数远非完美,但它们很多,只是限于以下5个值:

heartRate onSensorChanged values = [0.0], accuracy = 0, sensor = {Sensor name="Heart Rate Sensor", vendor="Motorola", version=1, type=21, maxRange=65535.0, resolution=1.0, power=0.45, minDelay=0}
heartRate onSensorChanged values = [53.0], accuracy = 2, sensor = {Sensor name="Heart Rate Sensor", vendor="Motorola", version=1, type=21, maxRange=65535.0, resolution=1.0, power=0.45, minDelay=0}
heartRate onSensorChanged values = [54.0], accuracy = 2, sensor = {Sensor name="Heart Rate Sensor", vendor="Motorola", version=1, type=21, maxRange=65535.0, resolution=1.0, power=0.45, minDelay=0}
heartRate onSensorChanged values = [55.0], accuracy = 2, sensor = {Sensor name="Heart Rate Sensor", vendor="Motorola", version=1, type=21, maxRange=65535.0, resolution=1.0, power=0.45, minDelay=0}
heartRate onSensorChanged values = [77.0], accuracy = 1, sensor = {Sensor name="Heart Rate Sensor", vendor="Motorola", version=1, type=21, maxRange=65535.0, resolution=1.0, power=0.45, minDelay=0}

大多数时候,我得到的是相同的53.0值,这似乎不是我的真实心率。77可能是正确的。


2
我在Moto 360上遇到了类似的问题。传感器总是返回0.0f作为值。
然后我等了两分钟,突然出现了values!=0。看起来这个传感器需要“热身”才能显示任何内容。如果考虑到它以每分钟心跳数为单位大约每秒测量一次发生的事情,那么它在一两分钟内就不可靠。而且每个应用程序都有自己的测量方式:另一个心率应用程序也在运行(例如Moto Body之类的应用程序)并不会影响它的测量。
这也意味着你必须创建一个服务来监听传感器(以及一个绑定器将传感器的值传递给你的活动或手机)。
请查看我在github上分享的演示项目: https://github.com/upost/MyHeartbeat

1
正如@Kent和@Murphy建议的那样,更新SDK是解决方案。在我的情况下,我需要放弃项目并从头开始创建新项目,因为即使使用更新后的SDK,旧项目也无法工作。

1
你能接受这个答案吗?这样每个人都知道问题已经解决了。 - Murphy
1
我认为诀窍在于从手表上卸载应用程序。以下是一个示例命令:adb -s localhost:4444 uninstall com.example.android.wearable.jumpingjack - Alexander K
我还有: android:minSdkVersion="20" android:targetSdkVersion="20"手表的SDK版本是4.4W.2,在我的SDK管理器中,SDK平台为rev.2,示例为rev.3,Wear映像为rev.4,源代码为rev.1。 - Alexander K
经过这些更改,我现在拥有心率传感器,并能够从中获取读数。 - Alexander K

0

所以,我也遇到了同样的问题,简单的解决方法就是使用adb将应用程序从手表上删除:

adb -s localhost:4444 uninstall com.*packagename*

然后只需使用Android Studio、Eclipse或您最初使用的任何工具重新安装它。

感谢Alexander K提供的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接