Android 使用googlefitapi的卡路里消耗

Android 使用googlefitapi的卡路里消耗,android,google-fit,google-fit-sdk,Android,Google Fit,Google Fit Sdk,我正在开发应用程序健身应用程序,为此我使用了谷歌健身api。到目前为止,我成功地获取了步数、距离,但无法获取卡路里消耗。 提前感谢您需要先设置用户的体重和身高。使用此信息计算消耗的卡路里 这些是我用来做这件事的方法。 (McClient是一个GoogleAppClient实例) 既然你没有一个正确的答案,我想这就是你需要的 public void displayCaloriesDataForToday() { DailyTotalResult

我正在开发应用程序健身应用程序,为此我使用了谷歌健身api。到目前为止,我成功地获取了步数、距离,但无法获取卡路里消耗。
提前感谢

您需要先设置用户的体重和身高。使用此信息计算消耗的卡路里

这些是我用来做这件事的方法。 (McClient是一个GoogleAppClient实例)


既然你没有一个正确的答案,我想这就是你需要的

      public void displayCaloriesDataForToday() {



                  DailyTotalResult resultcalories = Fitness.HistoryApi.readDailyTotal( mGoogleApiClient, DataType.TYPE_CALORIES_EXPENDED).await();
                    showStepDataSet(resultcalories.getTotal());

                }


    private void showStepDataSet(DataSet caloriesDataSet) {


            for (DataPoint dp : caloriesDataSet.getDataPoints()) {

                    //Do what you need

                }
            }

 public class ViewTodaysStepCountTask extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... params) {
            Timer timer = new Timer();

            timer.schedule( new TimerTask() {
                public void run() {
                    displayCaloriesDataForToday();
                }
            }, 0, 1*1000);

            return null;
        }
    }
public void display卡路里数据fortoday(){
DailyTotalResult ResultColories=Fitness.HistoryApi.readDailyTotal(mgoogleAppClient,DataType.TYPE_Carries_EXPENDED).wait();
showStepDataSet(resultColories.getTotal());
}
私有void showStepDataSet(数据集卡路里数据集){
对于(DataPoint dp:caloriesDataSet.getDataPoints()){
//做你需要的
}
}
公共类ViewTodaysStepCountTask扩展了AsyncTask{
受保护的Void doInBackground(Void…参数){
定时器=新定时器();
timer.schedule(新TimerTask(){
公开募捐{
显示今天的卡路里数据();
}
}, 0, 1*1000);
返回null;
}
}
public void display卡路里数据fortoday(){
DailyTotalResult ResultColories=Fitness.HistoryApi.readDailyTotal(mgoogleAppClient,DataType.TYPE_Carries_EXPENDED).wait();
showStepDataSet(resultColories.getTotal());
}
私有void showStepDataSet(数据集卡路里数据集){
浮动总成本=0;
total_cal=totalSet.isEmpty()
? 0
:totalSet.getDataPoints().get(0).getValue(Field.Field_.asFloat();
}
公共类ViewTodaysStepCountTask扩展了AsyncTask{
受保护的Void doInBackground(Void…参数){
定时器=新定时器();
timer.schedule(新TimerTask(){
公开募捐{
显示今天的卡路里数据();
}
}, 0, 1*1000);
返回null;
}
}

由于您没有明确说明要跟踪哪些卡路里,我为您提供了两种方法。第一种是通过RecordingAPI跟踪卡路里,第二种是从Fit Store获取卡路里消耗量

要获取当前燃烧的卡路里,您必须订阅RecordingAPI with Carries:

Fitness.RecordingApi.subscribe(mClient, DataType.TYPE_CALORIES_EXPENDED)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        if (status.getStatusCode()
                                == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
                            disRec=true;
                            new SharedPrefManager(MainActivityWithSpinner.this).setTracking(true);
                        } else {
                            new SharedPrefManager(MainActivityWithSpinner.this).setTracking(true);
                            disRec=true;
                            Toast.makeText(MainActivityWithSpinner.this,"Recording started for Calories",Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        Toast.makeText(MainActivityWithSpinner.this,"Distance  Recording faced some issues.Try again.",Toast.LENGTH_SHORT).show();
                    }
                }
            });  
Fitness.RecordingApi.subscribe(mClient,DataType.TYPE\u卡路里消耗)
.setResultCallback(新的ResultCallback(){
@凌驾
公共void onResult(状态){
if(status.issucess()){
if(status.getStatusCode()
==FitnessStatusCodes.成功(已订阅){
disRec=正确;
新SharedPrefManager(MainActivityWithSpinner.this).setTracking(true);
}否则{
新SharedPrefManager(MainActivityWithSpinner.this).setTracking(true);
disRec=正确;
Toast.makeText(MainActivityWithSpinner.this,“开始记录卡路里”,Toast.LENGTH_SHORT.show();
}
}否则{
Toast.makeText(MainActivityWithSpinner.this,“距离录制遇到一些问题。请重试。”,Toast.LENGTH_SHORT.show();
}
}
});  
然后您可以通过以下方法获得:

public String getCalories(long startTime,long endTime){
    String steps="";
    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();
    DataReadResult dataReadResult =
            Fitness.HistoryApi.readData(MainActivityWithSpinner.mClient, readRequest).await(1, TimeUnit.MINUTES);

    if(dataReadResult.getBuckets().size() > 0){
        for (Bucket bucket : dataReadResult.getBuckets()) {
            List<DataSet> dataSets = bucket.getDataSets();
            for (DataSet dataSet1 : dataSets) {
                for(DataPoint dataPoint:dataSet1.getDataPoints()){
                    for (Field field:dataPoint.getDataType().getFields()){
                        steps=String.format("%.2f",Float.parseFloat(dataPoint.getValue(field)+""))+"";
                    }
                }
            }

        }
    }
    return steps;
}
public  class InsertAndVerifyDataTask extends AsyncTask<Void, Void, Void> {
    String result="";
    long total;
    boolean datainsertionFailed=false;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        avLoadingIndicatorView.show();
    }

    protected Void doInBackground(Void... params) {

        DataReadRequest readRequest = queryFitnessData();

        DataReadResult dataReadResult =
                Fitness.HistoryApi.readData(MainActivityWithSpinner.mClient, readRequest).await(1, TimeUnit.MINUTES);
        PendingResult<DailyTotalResult> result =
                Fitness.HistoryApi.readDailyTotalFromLocalDevice(MainActivityWithSpinner.mClient, TYPE_CALORIES_EXPENDED);
        DailyTotalResult totalResult = result.await(30, SECONDS);
        if (totalResult.getStatus().isSuccess()) {
            DataSet totalSet = totalResult.getTotal();
            total = totalSet.isEmpty()
                    ? 0
                    : (long)totalSet.getDataPoints().get(0).getValue(FIELD_CALORIES).asFloat();
        } else {
            // handle failure
        }
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        DateFormat dateFormatFull = new SimpleDateFormat("dd/MM/yy");
        DateFormat dateFormatTemp=new SimpleDateFormat("E");
        datax.clear();
        if(dataReadResult.getBuckets().size() > 0){
            for (Bucket bucket : dataReadResult.getBuckets()) {
                List<DataSet> dataSets = bucket.getDataSets();
                for (DataSet dataSet1 : dataSets) {
                    for(DataPoint dataPoint:dataSet1.getDataPoints()){
                        for (Field field:dataPoint.getDataType().getFields()){
                            String dayOfWeek=dateFormatTemp.format(new Date(dataPoint.getStartTime(TimeUnit.MILLISECONDS)));
                            Calendar cal=Calendar.getInstance();
                            cal.setTime(new Date(dataPoint.getStartTime(TimeUnit.MILLISECONDS)));
                            int day=cal.get(Calendar.DAY_OF_MONTH);
                            String month=getMonth(cal.get(Calendar.MONTH));
                            String fullDate=dayOfWeek+", "+day+" "+month;
                            StepCountModel stepCountModel=new StepCountModel(String.format("%.2f",Float.parseFloat(dataPoint.getValue(field)+""))+"",fullDate,dateFormat.format(new Date(dataPoint.getStartTime(TimeUnit.MILLISECONDS))),dateFormat.format(new Date(dataPoint.getEndTime(TimeUnit.MILLISECONDS))));
                            datax.add(stepCountModel);
                            //result+="Field: "+field.getName()+"Value: "+dataPoint.getValue(field)+"Start: "+dateFormat.format(dataPoint.getStartTime(TimeUnit.MILLISECONDS))+"End: "+dateFormat.format(dataPoint.getEndTime(TimeUnit.MILLISECONDS))+"\n";
                        }
                    }
                }
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        todayCount.setText("Total Calories expended today: "+total+" cal");
        customAdapter.notifyDataSetChanged();
        avLoadingIndicatorView.hide();
    }
}


/**
 * Return a {@link DataReadRequest} for all step count changes in the past week.
 */
public static DataReadRequest queryFitnessData() {
    DateTimeZone timeZone = DateTimeZone.forID("Asia/Kolkata");
    DateTime today = new DateTime(timeZone).withTime(23,59,59,900);
    DateTime startDay = today.minusWeeks(1).withTimeAtStartOfDay();
    long endTime = today.getMillis();
    long startTime=startDay.getMillis();
    java.text.DateFormat dateFormat = getDateInstance();

    DataSource ESTIMATED_CALORIES_DELTAS = new DataSource.Builder()
            .setDataType(DataType.TYPE_CALORIES_EXPENDED)
            .setType(DataSource.TYPE_RAW)
            .setStreamName("estimated_calories")
            .build();
    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_CALORIES_EXPENDED,DataType.AGGREGATE_CALORIES_EXPENDED)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();
    // [END build_read_data_request]

    return readRequest;
}
公共字符串getCarries(长开始时间、长结束时间){
字符串步数=”;
DataReadRequest=newDataReadRequest.Builder()
.aggregate(DataType.TYPE\u卡路里消耗,DataType.aggregate\u卡路里消耗)
.bucketByTime(1,时间单位:天)
.setTimeRange(开始时间、结束时间、时间单位.毫秒)
.build();
DataReadResult DataReadResult=
Fitness.HistoryApi.readData(MainActivityWithSpinner.mClient,readRequest).wait(1,TimeUnit.MINUTES);
如果(dataReadResult.GetBucket().size()>0){
for(Bucket:dataReadResult.getbucket()){
List dataSets=bucket.getDataSets();
对于(数据集数据集1:数据集){
对于(DataPoint DataPoint:dataSet1.getDataPoints()){
for(字段:dataPoint.getDataType().getFields()){
steps=String.format(“%.2f”,Float.parseFloat(dataPoint.getValue(field)+”)+;
}
}
}
}
}
返回步骤;
}
要从Google Fit Store获取数据,您可以使用以下方法:

public String getCalories(long startTime,long endTime){
    String steps="";
    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();
    DataReadResult dataReadResult =
            Fitness.HistoryApi.readData(MainActivityWithSpinner.mClient, readRequest).await(1, TimeUnit.MINUTES);

    if(dataReadResult.getBuckets().size() > 0){
        for (Bucket bucket : dataReadResult.getBuckets()) {
            List<DataSet> dataSets = bucket.getDataSets();
            for (DataSet dataSet1 : dataSets) {
                for(DataPoint dataPoint:dataSet1.getDataPoints()){
                    for (Field field:dataPoint.getDataType().getFields()){
                        steps=String.format("%.2f",Float.parseFloat(dataPoint.getValue(field)+""))+"";
                    }
                }
            }

        }
    }
    return steps;
}
public  class InsertAndVerifyDataTask extends AsyncTask<Void, Void, Void> {
    String result="";
    long total;
    boolean datainsertionFailed=false;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        avLoadingIndicatorView.show();
    }

    protected Void doInBackground(Void... params) {

        DataReadRequest readRequest = queryFitnessData();

        DataReadResult dataReadResult =
                Fitness.HistoryApi.readData(MainActivityWithSpinner.mClient, readRequest).await(1, TimeUnit.MINUTES);
        PendingResult<DailyTotalResult> result =
                Fitness.HistoryApi.readDailyTotalFromLocalDevice(MainActivityWithSpinner.mClient, TYPE_CALORIES_EXPENDED);
        DailyTotalResult totalResult = result.await(30, SECONDS);
        if (totalResult.getStatus().isSuccess()) {
            DataSet totalSet = totalResult.getTotal();
            total = totalSet.isEmpty()
                    ? 0
                    : (long)totalSet.getDataPoints().get(0).getValue(FIELD_CALORIES).asFloat();
        } else {
            // handle failure
        }
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        DateFormat dateFormatFull = new SimpleDateFormat("dd/MM/yy");
        DateFormat dateFormatTemp=new SimpleDateFormat("E");
        datax.clear();
        if(dataReadResult.getBuckets().size() > 0){
            for (Bucket bucket : dataReadResult.getBuckets()) {
                List<DataSet> dataSets = bucket.getDataSets();
                for (DataSet dataSet1 : dataSets) {
                    for(DataPoint dataPoint:dataSet1.getDataPoints()){
                        for (Field field:dataPoint.getDataType().getFields()){
                            String dayOfWeek=dateFormatTemp.format(new Date(dataPoint.getStartTime(TimeUnit.MILLISECONDS)));
                            Calendar cal=Calendar.getInstance();
                            cal.setTime(new Date(dataPoint.getStartTime(TimeUnit.MILLISECONDS)));
                            int day=cal.get(Calendar.DAY_OF_MONTH);
                            String month=getMonth(cal.get(Calendar.MONTH));
                            String fullDate=dayOfWeek+", "+day+" "+month;
                            StepCountModel stepCountModel=new StepCountModel(String.format("%.2f",Float.parseFloat(dataPoint.getValue(field)+""))+"",fullDate,dateFormat.format(new Date(dataPoint.getStartTime(TimeUnit.MILLISECONDS))),dateFormat.format(new Date(dataPoint.getEndTime(TimeUnit.MILLISECONDS))));
                            datax.add(stepCountModel);
                            //result+="Field: "+field.getName()+"Value: "+dataPoint.getValue(field)+"Start: "+dateFormat.format(dataPoint.getStartTime(TimeUnit.MILLISECONDS))+"End: "+dateFormat.format(dataPoint.getEndTime(TimeUnit.MILLISECONDS))+"\n";
                        }
                    }
                }
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        todayCount.setText("Total Calories expended today: "+total+" cal");
        customAdapter.notifyDataSetChanged();
        avLoadingIndicatorView.hide();
    }
}


/**
 * Return a {@link DataReadRequest} for all step count changes in the past week.
 */
public static DataReadRequest queryFitnessData() {
    DateTimeZone timeZone = DateTimeZone.forID("Asia/Kolkata");
    DateTime today = new DateTime(timeZone).withTime(23,59,59,900);
    DateTime startDay = today.minusWeeks(1).withTimeAtStartOfDay();
    long endTime = today.getMillis();
    long startTime=startDay.getMillis();
    java.text.DateFormat dateFormat = getDateInstance();

    DataSource ESTIMATED_CALORIES_DELTAS = new DataSource.Builder()
            .setDataType(DataType.TYPE_CALORIES_EXPENDED)
            .setType(DataSource.TYPE_RAW)
            .setStreamName("estimated_calories")
            .build();
    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(DataType.TYPE_CALORIES_EXPENDED,DataType.AGGREGATE_CALORIES_EXPENDED)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();
    // [END build_read_data_request]

    return readRequest;
}
公共类InsertAndVerifyDataTask扩展了AsyncTask{
字符串结果=”;
长期总计;
boolean datainsertionFailed=false;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
avLoadingIndicatorView.show();
}
受保护的Void doInBackground(Void…参数){
DataReadRequest readRequest=queryFitnessData();
DataReadResult DataReadResult=
Fitness.HistoryApi.readData(MainActivityWithSpinner.mClient,readRequest).wait(1,TimeUnit.MINUTES);
Pendingreult结果=
Fitness.HistoryApi.readDailyTotalFromLocalDevice(MainActivity with spinner.mClient,TYPE\u carries\u expensed);
DailyTotalResult=结果。等待(30秒);
if(totalResult.getStatus().isSuccess()){
DataSet totalSet=totalResult.getTotal();
total=totalSet.isEmpty()
? 0
:(长)totalSet.getDataPoints().get(0).getValue(字段)。asFloat();
}否则{
//处理失败
}
日期格式
public void initialiseStepCounter() {
    FitnessOptions fitnessOptions =
            FitnessOptions.builder()
                    .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE)
                    .addDataType(DataType.TYPE_STEP_COUNT_DELTA)
                    .addDataType(DataType.TYPE_CALORIES_EXPENDED)
                    .build();
    if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(mContext), fitnessOptions)) {

        GoogleSignIn.requestPermissions(this,
                REQUEST_OAUTH_REQUEST_CODE,
                GoogleSignIn.getLastSignedInAccount(this),
                fitnessOptions);


        Log.i(TAG, "initialiseStepCounter: Fitness Counter Background Permission denied ");
    } else {
        subscribe();
    }
}

public void subscribe() {
    // To create a subscription, invoke the Recording API. As soon as the subscription is
    // active, fitness data will start recording.
    Fitness.getRecordingClient(mContext, GoogleSignIn.getLastSignedInAccount(mContext))
            .subscribe(DataType.TYPE_STEP_COUNT_CUMULATIVE)
            .addOnCompleteListener(
                    new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Log.i(TAG, "Successfully subscribed!");
                                readStepCountData(false, false, null);
                            } else {
                                Log.w(TAG, "There was a problem subscribing.", task.getException());
                            }
                        }
                    })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "There was a problem subscribing. steps"+ e.getMessage());
                }
            });


    Fitness.getRecordingClient(mContext, GoogleSignIn.getLastSignedInAccount(mContext))
            .subscribe(DataType.TYPE_CALORIES_EXPENDED)
            .addOnCompleteListener(
                    new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Log.i(TAG, "Successfully subscribed for calorie!");
                                readCalorieData(false);
                            } else {
                                Log.w(TAG, "There was a problem subscribing.", task.getException());
                            }
                        }
                    })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.i(TAG, "There was a problem subscribing."+ e.getMessage());
                }
            });

}

public void readCalorieData() {
    Fitness.getHistoryClient(mContext, GoogleSignIn.getLastSignedInAccount(mContext))
            .readDailyTotalFromLocalDevice(DataType.TYPE_CALORIES_EXPENDED)
            .addOnSuccessListener(
                    new OnSuccessListener<DataSet>() {
                        @Override
                        public void onSuccess(DataSet dataSet) {
                            int total =
                                    (int)(dataSet.isEmpty()
                                            ? 0
                                            : dataSet.getDataPoints().get(0).getValue(Field.FIELD_CALORIES).asFloat());
    Log.i(TAG,"Total calories = "+ total);
            })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.w(TAG, "There was a problem getting the calorie count.", e);
                        }
                    });
}

public void readStepCountData() {
    Fitness.getHistoryClient(mContext, GoogleSignIn.getLastSignedInAccount(mContext))
            .readDailyTotalFromLocalDevice(DataType.TYPE_STEP_COUNT_DELTA)
            .addOnSuccessListener(
                    new OnSuccessListener<DataSet>() {
                        @Override
                        public void onSuccess(DataSet dataSet) {
                            long total =
                                    dataSet.isEmpty()
                                            ? 0
                                            : dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
                                   Log.i(TAG,"Total steps = "+ total);
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Crashlytics.log("Error in getting step count = "+ e.getMessage());
                            Log.w(TAG, "There was a problem getting the step count.", e);
                        }
                    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == REQUEST_OAUTH_REQUEST_CODE) {
            mPresenter.subscribe();
        }

    }
}