【问题标题】:Google Fit API: Store heart rate bmp datapointsGoogle Fit API:存储心率 bpm 数据点
【发布时间】:2018-08-28 14:28:30
【问题描述】:

我正在尝试在我的应用中实施 Google Fit,但我无法获得存储心率 bpm 数据点的权限。起初我只尝试插入活动、速度、距离和步率数据,并且成功了。但是,一旦我添加了心率 bpm 权限和数据点,我就从 api 收到了错误 5000。

这些是我要求的健身权限:

FitnessOptions.builder()
.addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.TYPE_SPEED, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.TYPE_DISTANCE_CUMULATIVE, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE, FitnessOptions.ACCESS_WRITE)
.addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE)
.build();

然后,当我尝试使用会话 api 存储数据类型为 TYPE_HEART_RATE_BPM 的数据集时,出现错误 5000。

我也尝试在 Google Fit 应用程序中完全删除我的应用程序的权限,然后再次添加权限,但我仍然收到错误消息。存储心率数据是否可能需要额外的权限?还是只允许读取心率数据?

【问题讨论】:

  • 你有没有试过检查这个SO post关于谷歌健身授权的错误?
  • 我按照官方指南获取最新的 api。该帖子使用较旧的方法。我目前的猜测是 TYPE_HEART_RATE_BPM 类型可能只是从健身手表中读取心跳数据。我已经尝试过是否可以将心率数据存储为具有最小值、最大值和平均值的 AGGREGATE_HEART_RATE_SUMMARY 并且有效。但似乎这个心率数据稍后不会显示在 Google Fit 应用中。

标签: android google-fit google-fit-sdk


【解决方案1】:

我之前曾使用 Google fit 获取心率数据。最初,我遇到了同样的问题。如果您浏览以下链接中的文档 https://developers.google.com/android/reference/com/google/android/gms/fitness/data/DataType.html#TYPE_HEART_RATE_BPM

明确提到需要获得BODY_SENSORS权限

"Registering to, or subscribing to data of this type requires BODY_SENSORS"

如果用户没有授予BODY_SENSORS 的权限,那么我们将收到错误消息,因为我们将无法访问或插入心率数据。

您可以使用以下代码请求用户授予权限

ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.BODY_SENSORS},
                            BODY_SENSOR_PERMISSION_REQUEST_CODE);

您可以在“onRequestPermissionsResult”回调中检查用户是否已授予权限,然后请求心率数据。

根据要求添加示例代码。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{android.Manifest.permission.BODY_SENSORS},
                        BODY_SENSOR_PERMISSION_REQUEST_CODE);
            }



private class InsertAndVerifyDataTask extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... params) {
            // Create a new dataset and insertion request.
            DataSet dataSet = insertHeartData();
            // [START insert_dataset]
            // Then, invoke the History API to insert the data and await the result, which is
            // possible here because of the {@link AsyncTask}. Always include a timeout when calling
            // await() to prevent hanging that can occur from the service being shutdown because
            // of low memory or other conditions.
            com.google.android.gms.common.api.Status insertStatus =
                    Fitness.HistoryApi.insertData(connectFit.returnClient(), dataSet)
                            .await(1, TimeUnit.MINUTES);
            // Before querying the data, check to see if the insertion succeeded.
            if (!insertStatus.isSuccess()) {
                return null;
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            Toast.makeText(MainActivity.this, "Added", Toast.LENGTH_SHORT).show();
        }
    }

private DataSet insertHeartData() {
        // [START build_insert_data_request]

        try {
            Calendar cal = Calendar.getInstance();
            Date now = new Date();
            cal.setTime(now);
            long endTime = cal.getTimeInMillis();
            cal.add(Calendar.HOUR_OF_DAY, -1);
            long startTime = cal.getTimeInMillis();
            // Create a data source
            DataSource dataSource = new DataSource.Builder()
                    .setAppPackageName(this)
                    .setDataType(DataType.TYPE_HEART_RATE_BPM)
                    .setStreamName(" - heart count")
                    .setType(DataSource.TYPE_DERIVED)
                    .build();
            // Create a data set
            float hearRate = Float.parseFloat(((EditText) (findViewById(R.id.heartRate))).getText().toString().trim());
            DataSet dataSet = DataSet.create(dataSource);
            // For each data point, specify a start time, end time, and the data value -- in this case,
            // the number of new steps.
            DataPoint dataPoint = dataSet.createDataPoint()
                    .setTimeInterval(startTime, endTime, MILLISECONDS);
            dataPoint.getValue(Field.FIELD_BPM).setFloat(hearRate);
            dataSet.add(dataPoint);
            // [END build_insert_data_request]
            return dataSet;
        } catch (Exception e) {
            return null;
        }
    }

这对我有用。

【讨论】:

  • 我已经尝试过使用此权限,但据我记得上传数据时遇到了同样的错误。您能否提供有关如何构建和上传数据集的代码示例?
  • 感谢您的代码。出于某种原因,我现在能够上传心率数据,即使没有身体传感器正确。但现在我看到 Google Fit 应用程序中没有显示心率数据。 (无论是在健身课程中还是在心率选项卡中)关于其工作原理的任何想法?
猜你喜欢
  • 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
相关资源
最近更新 更多