Android GoogleFitAPI:存储心率bmp数据点

Android GoogleFitAPI:存储心率bmp数据点,android,google-fit,google-fit-sdk,Android,Google Fit,Google Fit Sdk,我试图在我的应用程序中实现Google Fit,但我在存储心率bpm数据点的权限方面遇到了问题。起初,我只尝试插入活动、速度、距离和步速数据,这很有效。但当我添加心率bpm权限和数据点时,api就出现了错误5000 以下是我请求的适应权限: FitnessOptions.builder() .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE) .addDataType(DataType.TYPE_SPE

我试图在我的应用程序中实现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();
然后,当我试图使用sessions api存储数据类型为\u HEART\u RATE\u BPM的数据集时,我发现了错误5000


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

我以前曾使用Google fit获取心率数据。起初,我也面临同样的问题。如果您浏览以下链接中的文档

它清楚地提到你需要获得许可

"Registering to, or subscribing to data of this type requires BODY_SENSORS"
ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.BODY_SENSORS},
                            BODY_SENSOR_PERMISSION_REQUEST_CODE);
如果用户没有授予权限,那么我们将得到错误,因为我们将无法访问或插入心率数据

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

"Registering to, or subscribing to data of this type requires 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;
        }
    }
if(Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.M){
requestPermissions(新字符串[]{android.Manifest.permission.BODY_SENSORS},
车身\传感器\许可\请求\代码);
}
私有类InsertAndVerifyDataTask扩展了AsyncTask{
受保护的Void doInBackground(Void…参数){
//创建新的数据集和插入请求。
DataSet数据集=insertHeartData();
//[开始插入数据集]
//然后,调用historyapi来插入数据并等待结果,结果是
//可能是因为{@link AsyncTask}。调用时始终包括超时
//wait()以防止由于以下原因关闭服务时可能发生的挂起
//内存不足或其它情况。
com.google.android.gms.common.api.Status insertStatus=
Fitness.HistoryApi.insertData(connectFit.returnClient(),dataSet)
.等待(1,时间单位为分钟);
//在查询数据之前,请检查插入是否成功。
如果(!insertStatus.issucess()){
返回null;
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
Toast.makeText(MainActivity.this,“Added”,Toast.LENGTH_SHORT.show();
}
}
专用数据集insertHeartData(){
//[开始生成\插入\数据\请求]
试一试{
Calendar cal=Calendar.getInstance();
现在日期=新日期();
校准设定时间(现在);
long-endTime=cal.getTimeInMillis();
计算添加(日历小时/天,-1);
long startTime=cal.getTimeInMillis();
//创建一个数据源
DataSource DataSource=新建DataSource.Builder()
.setAppPackageName(此)
.setDataType(数据类型.TYPE\u心率\u BPM)
.setStreamName(“-心脏计数”)
.setType(数据源.TYPE_派生)
.build();
//创建数据集
float-hearRate=float.parseFloat(((EditText)(findViewById(R.id.heartRate)).getText().toString().trim());
DataSet=DataSet.create(数据源);
//对于每个数据点,指定开始时间、结束时间和数据值——在本例中,
//新步骤的数量。
DataPoint DataPoint=dataSet.createDataPoint()
.setTimeInterval(开始时间、结束时间、毫秒);
dataPoint.getValue(Field.Field_BPM).setFloat(hearRate);
dataSet.add(数据点);
//[结束构建插入数据请求]
返回数据集;
}捕获(例外e){
返回null;
}
}

这对我有用

你有没有试着检查一下关于GoogleFit授权错误的信息?我遵循了最新api的官方指南。post使用较旧的方法。我目前的猜测是,类型\u HEART\u RATE\u BPM可能仅用于从健身手表读取心跳数据。我尝试过是否可以将心率数据存储为具有最小值、最大值和平均值的聚合\u HEART\u RATE\u摘要,这样做有效。但是很明显,这个心率数据以后不会在Google Fit应用程序中显示。我已经用这个权限尝试过了,但我记得在上传数据时也遇到了同样的错误。你能提供一个关于你如何构建和上传数据集的代码示例吗?谢谢你的代码。由于某种原因,我现在能够上传心率数据,即使没有身体传感器。但现在我看到谷歌Fit应用程序中没有显示心率数据。(无论是在健身课程中还是在心率表中)有没有关于这项工作原理的想法?