当前位置: 首页 > 知识库问答 >
问题:

Google Fit API:存储心率bmp数据点

宋经赋
2023-03-14

我正在尝试在我的应用程序中实现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 I存储数据类型为\u HEART\u RATE\u BPM的数据集时,会出现错误5000。

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

共有1个答案

太叔何平
2023-03-14

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

很明显,您需要获得BODY\u SENSORS许可

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

如果用户没有授予BODY\u传感器的权限,那么我们将得到错误,因为我们将无法访问或插入心率数据。

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

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;
        }
    }

这对我有用。

 类似资料:
  • 数据存储 Cookie 浏览器中的 Cookie 是指小型文本文件,通常在 4KB 大小左右。(由键值对构成用 ; 隔开)大部分时候是在服务器端对 Cookie 进行设置,在头文件中 Set-Cookie 来对 Cookie 进行设置。 页面可以访问当前页的 Cookie 也可以访问父域的 Cookie。 属性 属性 默认值 作用 Name(必填) 名 Value(必填) 值 Domain 当前文

  • 前端数据存储工具 YDN-DB forerunner AlaSQL LokiJS lovefiled Dexie.js localForage pouchdb

  • 笔试:10月22号笔试,提前刷刷行测也是有必要的,英语有两篇短文,还有一些英语单选,计算机专业知识考的很少。 一面:11月10号,面试时间比较短,数据中心偏运维,当时问我如何看待DevOps,用过什么自动化运维工具,还有就是论文相关内容,还有简历以及八股相关。大概五分钟。 二面:11月30号,领导面试+人力面试,大概15分钟 有一些简历问题,不太难,只要简历上写的能说上来就可以。 开放性问题: 问

  • 一个程序免不了要储存数据,对于Chrome扩展也是这样。通常Chrome扩展使用以下三种方法中的一种来储存数据:第一种是使用HTML5的localStorage,这种方法在上一节的内容中已经涉及;第二种是使用Chrome提供的存储API;第三种是使用Web SQL Database。 对于一般的扩展,“设置”这种简单的数据可以优先选择第一种,因为这种方法使用简单,可以看成是特殊的JavaScrip

  • 当我扩展CrudRepository接口时,我的子接口中有方法。我可以写 签入我的服务层。

  • 最大心率的 50% 到 100% 之间的范围分为五个心率区。将心率保持在某个心率区内,可以轻松控制锻炼的强度水平。每个心率区都有其自身的主要优点,了解这些优点将帮助您达到锻炼所需的效果。 继续阅读: 什么是心率区? 。