您的位置:首页 > 移动开发 > Android开发

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

2016-04-25 13:16 423 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息