0

我正在尝试创建一个类似于 Google 文档的自定义 DataType。

https://developers.google.com/fit/datatypes/custom

我可以成功创建 DataType 和 Field,但没有设置它的值。这是代码。

  public void writeCustomDatatype() throws ExecutionException, InterruptedException {

    // Write data to Fit
 Task<DataType> response = Fitness.getConfigClient(this, getGoogleAccount())
            .createCustomDataType(new DataTypeCreateRequest.Builder()
            .setName("com.google.android.gms.fit.samples.stepcounter.CustomDataGender1")
                    .addField("custom", Field.FORMAT_INT32)
                    .build());

    // Get data to Fit
             response = Fitness.getConfigClient(this, getGoogleAccount())
            .readDataType("com.google.android.gms.fit.samples.stepcounter.CustomDataGender1")
                     .addOnSuccessListener(new OnSuccessListener<DataType>() {
                         @Override
                         public void onSuccess(DataType dataType) {
                              dataTypeGender =  dataType;
                             updateGender();
                             Log.w(TAG, "Success in getting the gender" + dataType);
                         }
                     }).addOnFailureListener(
                             new OnFailureListener() {
                                 @Override
                                 public void onFailure(@NonNull Exception e) {
                                     Log.w(TAG, "There was a problem getting the gender.", e);
                                 }
                             });
}

// Updating Gender
private Task<Void> updateGender() {
    // Create a new dataset and update request.
    DataSet dataSet = updateGenderData();
    long startTime = 0;
    long endTime = 0;

    // Get the start and end times from the dataset.
    for (DataPoint dataPoint : dataSet.getDataPoints()) {
        startTime = dataPoint.getStartTime(TimeUnit.MILLISECONDS);
        endTime = dataPoint.getEndTime(TimeUnit.MILLISECONDS);
    }

    // [START update_data_request]
    Log.i(TAG, "Updating the Gender! - dataset in the History API.");

    DataUpdateRequest request =
            new DataUpdateRequest.Builder()
                    .setDataSet(dataSet)
                    .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
                    .build();

    // Invoke the History API to update data.
    return Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
            .updateData(request)
            .addOnCompleteListener(
                    new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                // At this point the data has been updated and can be read.
                                Log.i(TAG, "Data update was successful for Gender.");
                            } else {
                                Log.e(TAG, "There was a problem updating the dataset.", task.getException());
                            }
                        }
                    });
}


// Update the Gender Data
private DataSet updateGenderData(){
    Log.i(TAG, "Creating a new data update request.");

    Calendar cal = Calendar.getInstance();
    Date now = new Date();
    cal.setTime(now);
    cal.add(Calendar.MINUTE, 0);
    long endTime = cal.getTimeInMillis();
    cal.add(Calendar.MINUTE, 0);
    long startTime = cal.getTimeInMillis();

    // Create a data source
    DataSource dataSource =
            new DataSource.Builder()
                    .setAppPackageName(this)
                    .setDataType(dataTypeGender)
                    .setStreamName(TAG + " - Gender")
                    .setType(DataSource.TYPE_RAW)
                    .build();

    DataSet dataSet = DataSet.create(dataSource);

    DataPoint dataPoint = dataSet.createDataPoint().setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);

    Value value = dataPoint.getValue(Field.custom(gender));
    dataPoint.getValue(Field.FORMAT_STRING).setString(gender);

    String test = value.toString();

    dataSet.add(dataPoint);
    // [END build_update_data_request]
    return dataSet;
}

这两行都不起作用。Field.custom 的第一行不存在,因此即使我创建了 Field 和相应的 DataType,它在 IDE 中也是红色的。在第二行 dataPoint.getValue() 中,getValue() 方法需要一个字段,而现在没有其他字段真正起作用。

Value value = dataPoint.getValue(Field.custom(gender));
dataPoint.getValue(Field.FORMAT_STRING).setString(gender);

我需要一个字段,即使我创建了一个名为 custom 的自定义数据类型字段,我也无法使用一个名为 custom 的字段。这是来自我的调试器。

数据类型{com.google.android.gms.fit.samples.stepcounter.CustomDataGender1[custom(i)]}。

当我使用适用于预定义数据类型的自定义数据类型时,我无法设置自定义数据类型的值。像 TYPE.FIELD_WEIGHT 或 TYPE.FIELD_HEIGHT。这是一个例子:

DataPoint dataPoint =
            dataSet.createDataPoint().setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);
    dataPoint.getValue(Field.FIELD_HEIGHT).setFloat(heightDecimalMoved);

例如,这对我来说不是一个解决方案。我已经尝试了多种设置自定义字段的变体,它们目前都不起作用。 在 Google Fit 中为自定义数据类型设置数据点

这也是我使用上面的代码生成的自定义数据类型的样子。我使用整数作为格式,这就是为什么它说是 (i)。

数据类型{com.google.android.gms.fit.samples.stepcounter.CustomDataGender1[custom(i)]}

Google 预定义的 DataType 的 DataType 看起来像这样,这次是字符串格式。

数据类型{com.google.weight[weight(f)]}

任何想法要做什么或如何进行?我可以为自定义 DataType 创建一个具有原始数据类型的自定义字段。但是,我无法设置类似于来自 GoogleFit 的预定义 DataTypes 和我上面提供的示例的值,以及预定义的 DataTypes Weight 和 Height。

https://developers.google.com/android/reference/com/google/android/gms/fitness/data/DataType

4

0 回答 0