Google Fit API: Сохранение точек данных bmp сердечного ритма - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь внедрить Google Fit в свое приложение, но у меня возникают проблемы с разрешением хранить точки данных о частоте ударов в минуту. Сначала я только пытался вставить данные об активности, скорости, расстоянии и скорости шага, и это сработало. Но как только я добавил разрешение сердечного ритма и точки данных, я получил ошибку 5000 от API.

Это разрешения на фитнес, которые я запрашиваю:

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();

Затем, когда я пытаюсь сохранить набор данных с типом данных TYPE_HEART_RATE_BPM, используя сеансы с ошибкой 5000.

Я также попытался полностью удалить разрешение моего приложения в приложении Google Fit, а затем снова добавить разрешение, но я все еще получаю сообщение об ошибке. Может быть, для хранения данных о частоте сердечных сокращений требуется дополнительное разрешение? Или можно только читать данные сердечного ритма?

1 Ответ

0 голосов
/ 31 августа 2018

Ранее я работал над получением данных о частоте сердечных сокращений с помощью 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;
        }
    }

Это сработало для меня.

...