Я работаю над приложением для фитнеса, для этого я использовал Google Fit API. До сих пор я успешно подсчитываю количество шагов, расстояние, но не могу получить расход калорий. Заранее спасибо
Расход калорий с помощью Google Fit API
comment
У вас есть какой-либо надлежащий документ для использования Google Fit API?
- person realpranav   schedule 25.09.2015
comment
измените правильный ответ на этот, так как текущий правильный ответ не работает.
- person Mohit Yadav   schedule 29.12.2020
Ответы (4)
Сначала вам нужно установить вес и рост пользователя. На основе этой информации рассчитываются израсходованные калории.
Вот методы, которые я использую для этого. (mClient — это экземпляр GoogleApiClient)
public static void saveUserHeight(int heightCentimiters) {
// to post data
float height = ((float) heightCentimiters) / 100.0f;
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 heightDataSet = createDataForRequest(
DataType.TYPE_HEIGHT, // for height, it would be DataType.TYPE_HEIGHT
DataSource.TYPE_RAW,
height, // weight in kgs
startTime, // start time
endTime, // end time
TimeUnit.MILLISECONDS // Time Unit, for example, TimeUnit.MILLISECONDS
);
com.google.android.gms.common.api.Status heightInsertStatus =
Fitness.HistoryApi.insertData(mClient, heightDataSet)
.await(1, TimeUnit.MINUTES);
}
public static void saveUserWeight(float weight) {
// 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,
weight, // weight in kgs
startTime, // start time
endTime, // end time
TimeUnit.MILLISECONDS // Time Unit, for example, TimeUnit.MILLISECONDS
);
com.google.android.gms.common.api.Status weightInsertStatus =
Fitness.HistoryApi.insertData(mClient, weightDataSet)
.await(1, TimeUnit.MINUTES);
}
public static DataSet createDataForRequest(DataType dataType,
int dataSourceType,
Object values,
long startTime,
long endTime,
TimeUnit timeUnit) {
DataSource dataSource = new DataSource.Builder()
.setAppPackageName(appContext)
.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;
}
person
Marcio Granzotto
schedule
26.08.2015
Здравствуйте, спасибо за ваш ответ. На самом деле я новичок в Google Fit API, поэтому не знаю, как установить рост и вес. Я был бы благодарен, если бы вы помогли мне получить информацию о калориях.
- person Gaganpreet Singh; 27.08.2015
Если ответ сработал для вас, пожалуйста, проголосуйте и примите его, пожалуйста (:
- person Marcio Granzotto; 04.09.2015
Привет, Марсио Гранзотто еще не работал. У меня меньше баллов, поэтому я не могу проголосовать за него, но отмечен как принятый.
- person Gaganpreet Singh; 04.09.2015
Мне нужна надлежащая документация по использованию Google API
- person realpranav; 25.09.2015
Это не работает. Несмотря на то, что я предоставил Google API вес и рост моего пользователя, я все еще не могу получить данные о калориях =/, шаги, расстояние, работает нормально
- person Ryan Newsom; 07.01.2016
@RyanNewsom ты зарегистрировался в данных о калориях?
- person Marcio Granzotto; 11.01.2016
Поскольку у вас не было правильного ответа, я думаю, это то, что вам нужно
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;
}
}
person
António Paulo
schedule
06.04.2016
не могли бы вы написать весь код? Кажется, нет ресурса или учебника, который показывает все необходимые шаги.
- person suku; 09.06.2016
Поскольку вы не указали конкретно, что вы хотите отслеживать калории, я предлагаю вам два способа. Первый — для отслеживания калорий с помощью RecordingAPI, а второй — получение расхода калорий из Fit Store.
чтобы получить калории, сжигаемые в настоящее время, вы должны подписаться на RecordingAPI с калориями:
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();
}
}
});
то вы можете получить его с помощью метода ниже:
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;
}
чтобы получить данные из Google Fit Store, вы можете использовать следующий метод:
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;
}
person
Anuran Barman
schedule
14.02.2017
Это работает для меня.
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();
}
}
}
person
Nikhil Nyayadhish
schedule
29.05.2018