如何访问Android心率传感器的原始数据?(反射光,而不是心跳)

13

安卓SDK中的心率传感器仅返回计算出的心率值,而我对此不感兴趣。

我需要访问安卓心率传感器的原始数据,例如反射值强度等方面的数据。这是因为基本上心率传感器使用LED并测量随时间变化的反射率。

如果可能的话,访问任何图像传感器收集的原始图像数据将更加方便。谢谢。

相关的SO问题:从Android Wear心率传感器读取底层颜色/光数据?


请看这里:https://www.pubnub.com/blog/2015-09-17-tutorial-realtime-android-heart-rate-monitor-and-dashboard/ - Khairul Alam Licon
这很有趣,但不是我所需要的。我需要访问真实的Android心率传感器上的RAW图像数据,而不是相机。 - tcboy88
如果您想访问原始的PPG信号,请参见我的答案:https://stackoverflow.com/questions/47444302/android-wear-how-to-get-raw-ppg-data/52337056#52337056 - Mehdi Boukhechba
2个回答

5
你可以使用Google Fit的传感器API获取原始的心跳数据,如果选择使用Google Fit的话。有关详细信息,请查看Google Fit指南
private void trackHeartRate() {
    SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_HEART_RATE_BPM)
            // Can specify whether data type is raw or derived.
            .setDataSourceTypes(DataSource.TYPE_RAW)
            .build())
            .setResultCallback(new ResultCallback<DataSourcesResult>() {
                @Override
                public void onResult(DataSourcesResult dataSourcesResult) {
                    Log.i(TAG, "Result: " + dataSourcesResult.getStatus().toString());
                    for (DataSource dataSource : dataSourcesResult.getDataSources()) {
                        Log.i(TAG, "Data source found: " + dataSource.toString());
                        Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());

                        if (dataSource.getDataType().equals(DataType.TYPE_HEART_RATE_BPM)
                                && mListener == null) {
                            Log.i(TAG, "Data source for heart rate found!  Registering.");
                            registerFitnessDataListener(dataSource,
                                    DataType.TYPE_HEART_RATE_BPM);
                        }
                    }
                }
            });
    mListener = new OnDataPointListener() {
        @Override
        public void onDataPoint(DataPoint dataPoint) {
            for (Field field : dataPoint.getDataType().getFields()) {
                Value val = dataPoint.getValue(field);
                Log.i(TAG, "Detected DataPoint field: " + field.getName());
                Log.i(TAG, "Detected DataPoint value: " + val);
            }
        }
    };
}

private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
    Fitness.SensorsApi.add(
            mClient,
            new SensorRequest.Builder()
                    .setDataSource(dataSource) // Optional but recommended for custom data sets.
                    .setDataType(dataType) // Can't be omitted.
                    .setSamplingRate(10, TimeUnit.SECONDS)
                    .build(),
            mListener)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        Log.i(TAG, "Listener registered!");
                    } else {
                        Log.i(TAG, "Listener not registered.");
                    }
                }
            });
}

希望这能帮到你。

这非常有帮助,但仍不是我所需的。我不需要心跳率,即使它是“原始”的心率。我需要访问用于计算心跳的反射光。抱歉没有表达清楚。 - tcboy88
你的评论和修改后的问题使得问题更加清晰易懂。除非我漏掉了什么,否则通过Android框架无法获取这样的数字化波形数据,尽管它可能是设备驱动程序级别API的一部分(我甚至怀疑是否有这样的API)。但即使在这种情况下,它也只会暴露并提供给制造商和OEM。我的建议是寻找一个独立的设备,可以实现你所需要的功能,并且具有通过BT或WiFi的某种API,最好还带有一些适用于Android的示例代码。祝你好运! - Kaamel
谢谢,我知道这不是通过API可用的。这就是为什么我期望通过Root或修改内核它可能是可能的,并希望有人知道这一点。 - tcboy88

2

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