【问题标题】:Add/Read weight and height in GoogleFit? Android在 GoogleFit 中添加/读取体重和身高?安卓
【发布时间】:2014-11-14 12:08:42
【问题描述】:

通过 Google,我得到了插入 DataType.TYPE_STEP_COUNT_DELTA 的代码。但是如何使用 Android 插入TYPE_HEIGHT AND TYPE_WEIGHT

 com.google.android.gms.common.api.Status insertStatus =
                    Fitness.HistoryApi.insertData(mClient, dataSet)
                            .await(1, TimeUnit.MINUTES);

【问题讨论】:

    标签: android google-fit


    【解决方案1】:

    要插入数据,您需要为身高和体重创建一个新的 DataSet 对象。

    我创建了一个方法来获取带有请求所需参数的 DataSet 对象。

    /**
     * This method creates a dataset object to be able to insert data in google fit
     * @param dataType DataType Fitness Data Type object
     * @param dataSourceType int Data Source Id. For example, DataSource.TYPE_RAW
     * @param values Object Values for the fitness data. They must be int or float
     * @param startTime long Time when the fitness activity started
     * @param endTime long Time when the fitness activity finished
     * @param timeUnit TimeUnit Time unit in which period is expressed
     * @return
     */
    private DataSet createDataForRequest(DataType dataType, int dataSourceType, Object values,
                                         long startTime, long endTime, TimeUnit timeUnit) {
        DataSource dataSource = new DataSource.Builder()
                .setAppPackageName(mAppId)
                .setDataType(dataType)
                .setType(dataSourceType)
                .build();
    
        DataSet dataSet = DataSet.create(dataSource);
        DataPoint dataPoint = dataSet.createDataPoint().setTimeInterval(startTime, endTime, timeUnit);
    
        if (values instanceof Integer) {
            dataPoint = dataPoint.setIntValues((Integer)values);
        } else {
            dataPoint = dataPoint.setFloatValues((Float)values);
        }
    
        dataSet.add(dataPoint);
    
        return dataSet;
    }
    

    然后,你需要做这样的事情:

         DataSet weightDataSet = createDataForRequest(
               DataType.TYPE_WEIGHT,    // for height, it would be DataType.TYPE_HEIGHT
               DataSource.TYPE_RAW,
               value,                  // weight in kgs
               startTime,              // start time
               endTime,                // end time
               timeUnit                // Time Unit, for example, TimeUnit.MILLISECONDS
          );
    
        com.google.android.gms.common.api.Status weightInsertStatus =
                Fitness.HistoryApi.insertData(mClient, weightDataSet )
                        .await(1, TimeUnit.MINUTES);
    

    如果您阅读Google Fit doc,这将非常有帮助。在那里,您可以阅读有关data types的更多信息

    希望对你有帮助^^

    【讨论】:

    • 我通过以下方法按照您的建议做了同样的事情:请参阅我的帖子:知道为什么我会得到:插入数据集时出现问题。
    • 现在试试,文档中有错字。
    • 顺便问一下,您申请过在 Google Fit API 中写入的权限吗?
    • 也许您没有在代码中添加正文权限。我建议阅读此回复:stackoverflow.com/questions/26390192/…
    • 对我来说只有 dataPoint.getValue(Field.FIELD_WEIGHT).setFloat((Integer)values);
    【解决方案2】:
    private DataSet createDataForRequest(DataType dataType
    ,float dataSourceType
    ,int values
    ,long startTime, long endTime, TimeUnit timeUnit) {
    
        DataSource dataSource = new DataSource.Builder()
                .setAppPackageName(this)
                .setDataType(dataType)
                .setType(DataSource.TYPE_RAW)
                .build();
    
        DataSet dataSet = DataSet.create(dataSource);
        DataPoint dataPoint = dataSet.createDataPoint().setTimeInterval(startTime, endTime, timeUnit);
    
        float weight = Float.parseFloat(""+values);
    
        dataPoint = dataPoint.setFloatValues(weight);
    
        dataSet.add(dataPoint);
    
        return dataSet;
    }
    
    // to post data
    Calendar cal = Calendar.getInstance();
    Date now = new Date();
    cal.setTime(now);
    long endTime = cal.getTimeInMillis();
    cal.add(Calendar.DAY_OF_YEAR, -1);
    long startTime = cal.getTimeInMillis();
    
    DataSet weightDataSet = createDataForRequest(
            DataType.TYPE_WEIGHT,    // for height, it would be DataType.TYPE_HEIGHT
            DataSource.TYPE_RAW,
            56,                  // weight in kgs
            startTime,              // start time
            endTime,                // end time
            TimeUnit.MINUTES                // Time Unit, for example, TimeUnit.MILLISECONDS
    );
    
    com.google.android.gms.common.api.Status weightInsertStatus =
            Fitness.HistoryApi.insertData(mClient, weightDataSet )
                    .await(1, TimeUnit.MINUTES);
    
    // Before querying the data, check to see if the insertion succeeded.
    if (!weightInsertStatus.isSuccess()) {
        Log.i(TAG, "There was a problem inserting the dataset.");
        return null;
    }
    
    // At this point, the data has been inserted and can be read.
    Log.i(TAG, "Data insert was successful!");
    
    // I'm getting : There was a problem inserting the dataset.
    

    【讨论】:

      【解决方案3】:

      您可以使用以下方法在更新的 GoogleFit API 中插入体重和身高:

      private void insertWeightHeight(Context context, DataType dataType, float value) {
              long startTime = Calendar.getInstance().getTimeInMillis();
              long endTime = startTime;
              DataSource dataSource = new DataSource.Builder()
                      .setAppPackageName(getContext())
                      .setDataType(dataType)
                      .setType(DataSource.TYPE_RAW)
                      .build();
      
              DataPoint dataPoint = DataPoint.builder(dataSource)
                      .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
                      .setFloatValues(value)
                      .build();
      
              DataSet dataSet = DataSet.builder(dataSource)
                      .add(dataPoint)
                      .build();
      
              Fitness.getHistoryClient(context, GoogleSignIn.getLastSignedInAccount(context))
                      .insertData(dataSet)
                      .addOnSuccessListener(new OnSuccessListener<Void>() {
                          @Override
                          public void onSuccess(Void aVoid) {
                              System.out.println("success");
                          }
                      })
                      .addOnFailureListener(new OnFailureListener() {
                          @Override
                          public void onFailure(@NonNull Exception e) {
                              System.out.println("failed");
                          }
                      });
          }
      

      你可以这样调用这个方法:

      insertWeightHeight(getContext(), DataType.TYPE_WEIGHT, 70f);//weight in kg
      insertWeightHeight(getContext(), DataType.TYPE_HEIGHT, 1.75f);//height in meter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 2011-01-15
        相关资源
        最近更新 更多