草庐IT

安卓 : Streaming Heart Rate from Microsoft Band

coder 2023-12-11 原文

我目前正在开发一个 Android 应用程序,它可以从 Microsoft Band 接收心率数据。这里我的 Activity 从项目示例 Accelerometer 修改而来:

    package com.microsoft.band.sdk.sampleapp;

import com.microsoft.band.BandClient;
import com.microsoft.band.BandClientManager;
import com.microsoft.band.BandException;
import com.microsoft.band.BandInfo;
import com.microsoft.band.BandIOException;
import com.microsoft.band.ConnectionState;
import com.microsoft.band.UserConsent;
import com.microsoft.band.sdk.sampleapp.streaming.R;
import com.microsoft.band.sensors.SampleRate;

import com.microsoft.band.sensors.BandHeartRateEvent;
import com.microsoft.band.sensors.BandHeartRateEventListener;
import com.microsoft.band.sensors.HeartRateConsentListener;



import android.os.Bundle;
import android.view.View;
import android.app.Activity;
import android.os.AsyncTask;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class BandStreamingAppActivity extends Activity {

    private BandClient client = null;
    private Button btnStart;
    private TextView txtStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtStatus = (TextView) findViewById(R.id.txtStatus);
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                txtStatus.setText("");
                new appTask().execute();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        txtStatus.setText("");
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (client != null) {
            try {
                client.getSensorManager().unregisterAccelerometerEventListeners();
            } catch (BandIOException e) {
                appendToUI(e.getMessage());
            }
        }
    }

    private class appTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                if (getConnectedBandClient()) {
                    appendToUI("Band is connected.\n");
                    // client.getSensorManager().registerAccelerometerEventListener(mAccelerometerEventListener, SampleRate.MS128);
                    client.getSensorManager().registerHeartRateEventListener(heartRateListener);

                } else {
                    appendToUI("Band isn't connected. Please make sure bluetooth is on and the band is in range.\n");
                }
            } catch (BandException e) {
                String exceptionMessage="";
                switch (e.getErrorType()) {
                case UNSUPPORTED_SDK_VERSION_ERROR:
                    exceptionMessage = "Microsoft Health BandService doesn't support your SDK Version. Please update to latest SDK.";
                    break;
                case SERVICE_ERROR:
                    exceptionMessage = "Microsoft Health BandService is not available. Please make sure Microsoft Health is installed and that you have the correct permissions.";
                    break;
                default:
                    exceptionMessage = "Unknown error occured: " + e.getMessage();
                    break;
                }
                appendToUI(exceptionMessage);

            } catch (Exception e) {
                appendToUI(e.getMessage());
            }
            return null;
        }
    }

    private void appendToUI(final String string) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                txtStatus.setText(string);
            }
        });
    }



    private BandHeartRateEventListener heartRateListener = new BandHeartRateEventListener() {
        @Override
        public void onBandHeartRateChanged(final BandHeartRateEvent event) {
            if (event != null) {
                appendToUI(String.format(" HR = %i", event.getHeartRate()));
            }
        }

    };


    private boolean getConnectedBandClient() throws InterruptedException, BandException {
        if (client == null) {
            BandInfo[] devices = BandClientManager.getInstance().getPairedBands();
            if (devices.length == 0) {
                appendToUI("Band isn't paired with your phone.\n");
                return false;
            }
            client = BandClientManager.getInstance().create(getBaseContext(), devices[0]);
        } else if (ConnectionState.CONNECTED == client.getConnectionState()) {
            return true;
        }

        appendToUI("Band is connecting...\n");
        return ConnectionState.CONNECTED == client.connect().await();
    }
}

但是,我在应用程序运行时遇到此错误:

Unknown Error occured : User has not given consent for use of heart rate data 

然后我查看文档,它说:

  1. 实现HeartRateConsentListener接口(interface)

    @Override
        public void userAccepted(boolean consentGiven) {
        // handle user's heart rate consent decision
        };
    
  2. 确保用户同意心率传感器流式传输

    // check current user heart rate consent
    if(client.getSensorManager().getCurrentHeartRateConsent() !=
    UserConsent.GRANTED) {
    // user has not consented, request it
    // the calling class is both an Activity and implements
    // HeartRateConsentListener
    bandClient.getSensorManager().requestHeartRateConsent(this, this);
    }
    

问题是我不知道如何在我的代码中实现文档所说的内容。

最佳答案

在他明确同意之前,您不会获得用户的 HR 数据(他只需要同意一次)。

因此,不是使用这行代码:client.getSensorManager().registerHeartRateEventListener(heartRateListener); 您必须检查 UserConsent.GRANTED == true 是否为在文档的第三点中说。 如果为 true,您可以像之前一样注册 HR 传感器事件监听器,但如果为 false,则必须调用 requestHeartRateConsent

if(client.getSensorManager().getCurrentHeartRateConsent() == UserConsent.GRANTED) {
    startHRListener();
    } else {
// user has not consented yet, request it
client.getSensorManager().requestHeartRateConsent(BandStreamingAppActivity.this, mHeartRateConsentListener);
}

屏幕上会出现一个紫色对话框。用户可以选择是/否。他的选择将是 b 的值,并且还将保存在 UserConsent.GRANTED 中。如果 b == true,现在您可以注册 HR 传感器事件监听器,如果它是 false,请执行您想要的任何操作以通知用户不会获取 HR工作。如文档的第二点所述,所有这些都在 HeartRateConsentListener 接口(interface)中处理。您需要的代码是:

private HeartRateConsentListener mHeartRateConsentListener = new HeartRateConsentListener() {
        @Override
        public void userAccepted(boolean b) {
            // handle user's heart rate consent decision
            if (b == true) {
                // Consent has been given, start HR sensor event listener
                startHRListener();
            } else {
                // Consent hasn't been given
                appendToUI(String.valueOf(b));
            }
        }
    };

public void startHRListener() {
        try {
            // register HR sensor event listener
            client.getSensorManager().registerHeartRateEventListener(mHeartRateEventListener);
        } catch (BandIOException ex) {
            appendToUI(ex.getMessage(), band);
        } catch (BandException e) {
            String exceptionMessage="";
            switch (e.getErrorType()) {
                case UNSUPPORTED_SDK_VERSION_ERROR:
                    exceptionMessage = "Microsoft Health BandService doesn't support your SDK Version. Please update to latest SDK.";
                    break;
                case SERVICE_ERROR:
                    exceptionMessage = "Microsoft Health BandService is not available. Please make sure Microsoft Health is installed and that you have the correct permissions.";
                    break;
                default:
                    exceptionMessage = "Unknown error occurred: " + e.getMessage();
                    break;
            }
            appendToUI(exceptionMessage, band);

        } catch (Exception e) {
            appendToUI(e.getMessage(), band);
        }
    }

关于安卓 : Streaming Heart Rate from Microsoft Band,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30090668/

有关安卓 : Streaming Heart Rate from Microsoft Band的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  3. ruby-on-rails - 序数 : '1' as '1st' , '2' 为 '2nd' 等的 Ruby 格式 - 2

    ruby或rails中是否有任何东西可以处理序数的格式:'1'为'1st','2'为'2nd',等等? 最佳答案 看起来你正在寻找序号:TheRubyonRailsframeworkischockfullofinterestinglittlenuggets.Ordinalizeisanumberextensionthatreturnsthecorrespondingordinalnumberasastring.Forinstance,1.ordinalizereturns“1st”and22.ordinalizereturn“22n

  4. javascript - ND-Buffer 和 G-Buffer 有什么区别? - 2

    我是WebGL的菜鸟。我读了几篇关于ND-Buffers和G-Buffers的帖子,好像它是WebGL开发的战略选择。ND-Buffers和G-Buffers与渲染管线有什么关系?ND-Buffers是否仅用于前向渲染,而G-Buffer仅用于延迟渲染?如何实现两者的JavaScript代码示例将有助于我理解差异。 最佳答案 G-Buffers只是一组通常用于延迟渲染的缓冲区。Wikipedia给出了g-buffer中常见数据类型的一个很好的例子漫反射颜色信息世界空间或屏幕空间法线深度缓冲区/Z缓冲区这3个缓冲区的组合称为“g缓冲区

  5. javascript - Eloquent JavaScript 2nd Edition 递归练习解答 - 2

    我试图解决在线书籍eloquentjavascript2ndedition的递归练习:问题是这样的:We’veseenthat%(theremainderoperator)canbeusedtotestwhetheranumberisevenoroddbyusing%2tocheckifit’sdivisiblebytwo.Here’sanotherwaytodefinewhethera(positive,whole)numberisevenorodd:Zeroiseven.Oneisodd.ForanyothernumberN,itsevennessisthesameasN-2.De

  6. 微信小程序安卓视频播放卡顿问题 - 2

    在微信小程序开发中遇到在video组件的两个问题1.安卓手机里播放视频会有明显的卡顿问题刚开始以为是网络问题,或者是视频文件问题。排查了一下发现都没问题最后加了个属性就OK了uniapp和原生小程序方法:custom-cache="false"custom-cache={{false}}video组件兼容iOS手机custom-cache加了这个属性会让2.iOS手机第一次播放视频会有几秒黑屏问题因此我加了当前手机型号的判断uni.getDeviceInfo().deviceType获取当前设备api当为iPhone时不加custom-cache属性,否则加上custom-cache=“fal

  7. 安卓渐变的背景框实现 - 2

    安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景万恶的设计小姐姐又来搞事情啦,你说好好的设计一个纯色的背景框框不好嘛,非要把一个框框弄成渐变的,如果不拿出放大镜估计没几个人能看出来它是渐变的。来,我让你看看是啥样框子是从左到右渐变的,设计应该是做了一个底图,然后上面盖了一个白色圆角矩形。那么我们该怎么去实现它呢?实现方法下面介绍三种实现它的方法。先贴上源码地址,大家记得给个starhttps://git

  8. javascript - 添加冒号(:) after every 2nd character using Javascript - 2

    我有一个字符串,想在每第二个字符后添加一个冒号(但不是在最后一组字符之后),例如:12345678成为12:34:56:78我一直在使用.replace(),例如:mystring=mystring.replace(/(.{2})/g,NOTSUREWHATGOESHERE)但是的正则表达式都没有:我用过work,但我没能在Google上找到任何有用的东西。谁能指出我正确的方向? 最佳答案 无需删除任何尾随冒号:mystring=mystring.replace(/..\B/g,'$&:')\B匹配一个零宽度的非单词边界;换句话说,

  9. javascript - 未捕获的 SweetAlert : Unexpected 2nd argument? - 2

    我有sweetalert的问题,我想在按钮点击时显示确认框警报,但它不起作用这是我的JS代码:$(document).ready(function(){$('[data-confirm]').on('click',function(e){e.preventDefault();//canceldefaultaction//Recuperatehrefvaluevarhref=$(this).attr('href');varmessage=$(this).data('confirm');//popupswal({title:"Areyousure??",text:message,type:

  10. 安卓手机浏览器:远程调试 - 2

    简介:有时我们需要调试手机浏览器网页信息,这时除了使用fiddler抓包拦截篡改,还可以通过USB连接,通过PC远程调试手机上的浏览器信息,进行映射。历史攻略:adb:安卓手机USB调试模式前置准备:网页内容在移动设备上的体验可能和电脑上完全不同。ChromeDevTools提供远程调试功能安卓远程调试支持:在浏览器选项卡中调试网站。在原生安卓应用中调试网页内容。将屏幕从你的安卓设备上投影到你的开发机器上。使用端口转发和虚拟主机映射来让安卓设备访问开发使用的服务器。操作步骤:1、手机通过USB连接电脑。2、开启手机调试模式。3、PC电脑edge输入:edge://inspect/#device

随机推荐