【问题标题】:Get Heart Rate from "Sensor" Samsung Gear Live从“传感器”Samsung Gear Live 获取心率
【发布时间】:2014-07-09 21:39:10
【问题描述】:

如何从Samsung Gear Live 上连接的传感器获取心率

我只是尝试通过

列出所有传感器
SensorManager  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor s : deviceSensors){
    Log.i(TAG, "" + s.getName());
}

但我只得到这些传感器:

07-09 23:18:05.047    3269-3269/com.sample.soma.wapp I/MyActivity﹕ MPU6515 Acceleration Sensor
07-09 23:18:05.047    3269-3269/com.sample.soma.wapp I/MyActivity﹕ MPU6515 Gyroscope Sensor
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ AK8963C Magnetic field Sensor
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ AK8963C Magnetic Sensor UnCalibrated
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ SAMSUNG Step Detector Sensor
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ SAMSUNG Step Counter Sensor
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ SAMSUNG Significant Motion Sensor
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ SAMSUNG Game Rotation Vector
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ SAMSUNG Tilt Wake Sensor
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ MPL Rotation Vector
07-09 23:18:05.057    3269-3269/com.sample.soma.wapp I/MyActivity﹕ MPL Orientation
07-09 23:18:05.067    3269-3269/com.sample.soma.wapp I/MyActivity﹕ MPL Gravity
07-09 23:18:05.067    3269-3269/com.sample.soma.wapp I/MyActivity﹕ MPL Linear Accelration

他们如何测量心率? Android W 应用程序的某些部分是否已开源,以便我查看?

感谢和问候。

【问题讨论】:

    标签: android wear-os


    【解决方案1】:

    Here 是一个说明如何读取心率传感器的要点。

    它的核心是:

    SensorManager mSensorManager = ((SensorManager)getSystemService(SENSOR_SERVICE));
    Sensor mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
    Sensor mStepCountSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    Sensor mStepDetectSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
    
    mSensorManager.registerListener(this, mHeartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mStepCountSensor, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mStepDetectSensor, SensorManager.SENSOR_DELAY_NORMAL);
    

    您还需要 AndroidManifest.xml 中的以下条目

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

    【讨论】:

    • 谢谢!错过了许可。
    • @Peter Friese,如果我在服务中调用 getSystemService(),我在“mBase”上下文中遇到 NPE 错误,你有解决方案吗?我有点想出一些东西,但不是彻底的。我在这里发帖,stackoverflow.com/questions/24970677/…你能帮我吗?非常感谢。
    • 嗨@TungMaiLe - 你设法解决了NPE问题吗?通常,原因是您试图在实例被正确实例化之前访问它。
    • 嗨@PeterFriese,是的,我确实用彻底的解决方案解决了这个问题,原因是我初始化了Service对象并直接调用onCreate()、onStartCommand()。我将其更改为使用调用上下文来调用 startService()。我仍然想知道为什么 onCreate()、onStartCommand() 保留为公共函数但调用它们会导致行为不端。
    【解决方案2】:

    一个小例子:(完整的要点在这里:https://gist.github.com/gabrielemariotti/d23bfe583e900a4f9276

    public class MyActivity extends Activity implements SensorEventListener {
    
            //Sensor and SensorManager
            Sensor mHeartRateSensor;
            SensorManager mSensorManager;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.heart_layout);
    
                //Sensor and sensor manager
                mSensorManager = ((SensorManager)getSystemService(SENSOR_SERVICE));
                mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
    
                //.... 
            }
    
            @Override
            protected void onResume() {
                super.onResume();
                //Register the listener
                if (mSensorManager != null){
                    mSensorManager.registerListener(this, mHeartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);
                }
            }
    
            @Override
            protected void onPause() {
                super.onPause();
                //Unregister the listener
                if (mSensorManager!=null)
                    mSensorManager.unregisterListener(this);
            }
    
            @Override
            public void onSensorChanged(SensorEvent event) {
                //Update your data. 
                if (event.sensor.getType() == Sensor.TYPE_HEART_RATE) {            
                     //heart rate = (int) event.values[0];
                    }
                }
            }
    
            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
            }
        }
    

    在您的清单中添加

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

    【讨论】:

    • 自华为手表最近23次更新以来,心率传感器始终为空:Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
    • 我发现了这个问题,随着 api 23 的出现,故事用户授予了每个应用程序的权限。因此,如果您的传感器为空,那么您没有在手表设置中授予权限,或者您在清单中忘记了它。
    【解决方案3】:

    有一篇博客文章与源代码一起讨论了这个问题:http://marctan.com/blog/2014/07/08/reading-heart-rate-data-from-samsung-gear-live/

    博文中需要注意的要点:

    • 文章使用了不同于 Sensor.TYPE_HEART_RATE 的值,它给出的准确度级别仅为 1。
    • 您还需要AndroidManifest.xml 中的以下条目

      &lt;uses-permission android:name="android.permission.BODY_SENSORS" /&gt;

    【讨论】:

    • 谢谢!错过了许可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多