Android wear开发如何获取心率(Heart Rate)

Android wear开发如何获取心率(HRM)呢?最近项目需要,自己研究了一下。国内关于Wear开发的资源太有限,在外网扒了扒,整理出来的!


首先,

我依旧是用的eclipse开发的,搭建了个android wear开发环境。

使用Samsung Gear Line做的测试。


实现方法:

1.First, declare this permission in your manifest: 首先,在你的manifest中声明权限:

<uses-permission android:name="android.permission.BODY_SENSORS" />


2.then get an instance of SensorManager and an instance of the Sensor that we want to use, the HR sensor in this case.然后获取 SensorManager 的对象,实例化你所需要使用的Seneor对象,在这个案例中是HR Sensor(心率传感器).

mSensorManager = ((SensorManager)getSystemService(SENSOR_SERVICE));
mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);

 
 
 3. 
 I initially tried to use  
 Sensor.TYPE_HEART_RATE 
  which was added in API Level 20 but I always end up getting  
 accuracy = 1 
  which is the lowest sensor accuracy. Then I found out that the demo app loaded in Samsung Gear Live was actually using a different value for the sensor type:  最初我尝试使用 在API20新增的Sensor.TYPE_HEART_RATE,但是结果总是获取到accuracy = 1,这意味着传感器准确度很低。最后我发现运行在Samsung Gear Live上的app实际上使用的是不同的传感器类型的值。 
 

mHeartRateSensor = mSensorManager.getDefaultSensor(65562);

4. This produces  accuracy = 3  which is what we really need. This isn’t documented else where (as far as I know) so maybe in the future, they’ll update the official documentation or they will fix it in future OS updates. 这个accuracy = 3精确度为3的才是我们需要的。后面的是歪果仁扯淡的话,无关紧要,接着主题···呵呵

Using Sensor.TYPE_HEART_RATE (使用Sensor.TYPE_HEART_RATE运行起来获取到的参数,确实误差很大,精确度也太低)。

Using 65562 as Sensor Type (将65562作为传感器类型获取到的参数,精准度为Accuracy=3)

5.After that, you can now register a listener for sensor data by calling: 然后,你需要为Sensor注册事件用于回调数据。

   protected void onStart() {
        super.onStart();

        mSensorManager.registerListener(this, this.mHeartRateSensor, 3);
    }
6. In this case, we let our activity be the listener for sensor data so we must implement SensorEventListener and override these two methods:既然这样,我们需要实现SensorEventListener接口,复写下面这两个函数,让我们Activity监听传感器的数据。

 @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Log.d(TAG, "sensor event: " + sensorEvent.accuracy + " = " + sensorEvent.values[0]);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
        Log.d(TAG, "accuracy changed: " + i);
    }
7. Lastly, we need to make sure that we unregister our listener when we exit our application.最后就是我们需要确保我们退出应用时取消注册。

 @Override
    protected void onStop() {
        super.onStop();

        mSensorManager.unregisterListener(this);
    }


好了,跑起来试一试。

在这里我也说一下我遇到的奇葩问题,因为我使用的是Samsung Gear Line 做的测试,不知道其他的智能手表会不会遇到这类问题。

1.在遍历SensorList的时候该智能手表不存在Heart Rate Seneor。

List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
		 for (Sensor sensor : sensors) {
		
		 Log.e(TAG,
		 "遍历sensor:[name=" + sensor.getName() + ";type="
		 + sensor.getType() + ";vendor="
		 + sensor.getVendor() + "]");
		 }

这就意味了如果你获取Snesor.TYPE_HEART_RATE 获取65562时,获取不到。就会导致下面的错误。

2,获取HRM的Sensor对象时,报错指针。 mHrSensor =null;

mHrSensor = mSensorManager.getDefaultSensor(65562);

因为获取不到,肯定返回null报错。权限都加了的情况下,无论怎么样都获取不到。花了一天时间在国外网站扒呀扒,也去了 Samsung  Developer上查找。有很多国外网友也在咨询这个问题。有的说是API版本太低要更新,有的说是确实获取不到,需要使用三星自己的api。还有得不了了之。。。


···················

后来,我重新设置了一下智能手表中的一些设置,然后智能手表丢一边下班了。周一来上班时,手表没电关机了,于是充了电点开机,打开app,发现后面的紫外线灯亮起来了,app上也有数据了。


Demo (代码)下载:http://download.csdn.net/detail/kern_/9501665

相关资料:http://developer.samsung.com/search/searchList.do?searchTop=HEART+RATE







猜你喜欢

转载自blog.csdn.net/kern_/article/details/51241291